无法使用selenium webdriver + firefox

时间:2016-10-27 08:32:07

标签: python selenium pdf firefox selenium-webdriver

我有一个selenium脚本,作为执行的一部分,需要下载PDF,并且下次使用PDF时需要下载。我已经使用配置文件首选项方法来下载文件,这在我用于开发的虚拟机上运行良好,但是当将脚本移动到实时服务器时,它似乎不想下载所需的PDF一点都不以下是我用来设置firefox配置文件的行:

fxProfile = webdriver.FirefoxProfile()
fxProfile.set_preference("browser.download.folderList",2)
fxProfile.set_preference("browser.download.manager.showWhenStarting",False)
fxProfile.set_preference("browser.download.dir",foldername)
fxProfile.set_preference("browser.helperApps.neverAsk.saveToDisk","application/pdf")
fxProfile.set_preference("pdfjs.disabled",True)
fxProfile.set_preference("plugin.scan.Acrobat", "99.0");
fxProfile.set_preference("plugin.scan.plid.all", False);
fxProfile.set_preference("plugin.disable_full_page_plugin_for_types", "application/pdf")
fxProfile.set_preference("browser.helperApps.alwaysAsk.force", False);
driver = webdriver.Firefox(firefox_profile=fxProfile)

在虚拟机上,首选项行在禁用pdfjs时结束,这样可以正常工作,之后是我试图在实时机器上解决问题的额外行。

变量foldername是正确的,因为相同的变量用于打开和写入日志失败,其功能正常。据我所知,操作系统级窗口确认下载没有打开,因为我仍然可以指示脚本在点击下载链接后点击网站的其他部分。我也确保我给脚本足够的时间来下载文件(30+秒下载有线连接上的子1mb PDF应该绰绰有余)。

问题是现场机器是一台服务器,因此我没有物理屏幕可以让我看到究竟发生了什么,这使得修复起来更加困难。同样,它在我的虚拟机上工作正常,我可以看到正在发生的事情,但无法在实时服务器上每次都下载PDF,而不会抛出任何错误。

1 个答案:

答案 0 :(得分:0)

我通过将 selenium 会话传递给 Python requests 库然后从那里获取 PDF 解决了这个问题。我在 this StackOverflow answer 中有更长的文章,但这里有一个简单的例子:

import requests
from selenium import webdriver

pdf_url = "/url/to/some/file.pdf"

# setup webdriver with options 
driver = webdriver.Firefox(..options)

# do whatever you need to do to auth/login/click/etc.

# navigate to the PDF URL in case the PDF link issues a 
# redirect because requests.session() does not persist cookies
driver.get(pdf_url)

# get the URL from Selenium 
current_pdf_url = driver.current_url

# create a requests session
session = requests.session()

# add Selenium's cookies to requests
selenium_cookies = driver.get_cookies()
for cookie in selenium_cookies:
    session.cookies.set(cookie["name"], cookie["value"])

# Note: If headers are also important, you'll need to use 
# something like seleniumwire to get the headers from Selenium 

# Finally, re-send the request with requests.session
pdf_response = session.get(current_pdf_url)

# access the bytes response from the session
pdf_bytes = pdf_response.content