我有一个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,而不会抛出任何错误。
答案 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