【问题标题】:Headless browser testing with download functionality?带有下载功能的无头浏览器测试?
【发布时间】:2015-03-12 14:24:10
【问题描述】:

我一直在寻找在 osx 中进行无头测试的解决方案。但我需要能够保存服务器返回的文件。

我已经测试了 selenium、phantomjs、casperjs 并查看了我可以在网上找到的任何内容。

它们都不支持下载。我错过了什么吗?是否有任何支持下载的无头浏览器/测试框架?

【问题讨论】:

  • CasperJS 有一个download 函数,所以它支持下载。 PhantomJS 支持下载,因为 CasperJS 是建立在它之上的。你遇到了什么问题?
  • @ArtjomB。下载功能是什么意思?该文件是 http post 的结果,因此它作为 Content-Disposition: 附件发送;文件名=文件名在标题中
  • 是的,当 PhantomJS 收到这样的请求时,它确实没有保存文件,但是有问题的文件可以是 downloaded matching event handler 这样的情况。
  • 是的!但您不能在标头附件上调用 resource.url。 @ArtjomB。因为资源 url 只是一个 html 页面。因此不是需要保存的文件

标签: selenium phantomjs casperjs headless-browser


【解决方案1】:

你可以做的是:

  • 启动虚拟显示(参见Xvfb
  • 启动 Firefox 浏览器并将首选项配置为自动保存 csv 文件

工作示例在带有额外 cmets 的 python 中(使用 pyvirtualdisplay xvfb 包装器):

from os import getcwd
import time

from pyvirtualdisplay import Display
from selenium import webdriver

# start the virtual display
display = Display(visible=0, size=(800, 600))
display.start()

# configure firefox profile to automatically save csv files in the current directory
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir", getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")

browser = webdriver.Firefox(firefox_profile=fp)
browser.get('http://www.nationale-loterij.be/nl/onze-spelen/lotto/resultaten')

# check the option
browser.find_element_by_id('corporatebody_3_corporategrid93961a8f9b424ed6bd0697df356d9483_1_rblType_0').click()

# click the link
browser.find_element_by_name('corporatebody_3$corporategrid93961a8f9b424ed6bd0697df356d9483_1$btnDownload').click()

# hardcoded delay for waiting a file download (better check for the downloaded file to appear on the disk)
time.sleep(2)

# quit the browser
browser.quit()

# stop the display
display.stop()

另见:

【讨论】:

  • 这确实下载了文件,但它仍然显示一个Firefox框架,所以这可能有效,但它并不是真正的无头。还是应该显示 Firefox?
  • @Mars 我怀疑这是因为你有一个真实的显示器,因此没有使用虚拟显示器。
  • 不错的解决方案,但是当我尝试在输入元素上执行 clear() 时,我得到一个 selenium 异常 Element is not currently interactable and may not be manipulated。如果你可以click() 元素而不是clear() 它们,这似乎很奇怪。
  • 问题指定 OSX... Xvfb 适用于 X11,不适用于 Mac。
【解决方案2】:

我在 OSX 上使用 selenium + wget 命令来执行下载。

这是一个代码示例:

new_driver = webdriver.Firefox()
new_driver.get(url)
for element in new_driver.find_elements_by_tag_name('img'):
    os.system('wget ' + element.get_attribute('src').rstrip('\n'))

【讨论】:

  • 我无法执行 wget,因为该文件作为 Content-Disposition: 附件位于帖子标题中;文件名=文件名
  • @Mars 你介意分享你正在处理的网址和代码吗?
  • @abema 这是我正在处理的网址nationale-loterij.be/nl/onze-spelen/lotto/resultaten 点击第一个项目符号并点击下载...
猜你喜欢
  • 2013-12-24
  • 2019-05-11
  • 2014-06-28
  • 2014-08-29
  • 2017-12-15
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多