我想在Python中使用selenium来自动执行下载过程。但目前的问题是,我可以使用xpath实际访问正确的URL(PDF文件所在的位置),但由于操作系统拨号框的原因我无法下载文件。我发现一些解决方案建议使用webdriver.FirefoxProfile().set.preference
。但是,由于我需要多次使用硒点击网站才能进入正确的页面,因此我无法在程序开始时直接使用set.preference
设置网址。你能帮我把set.preference
整合到我现有的程序中吗?非常感谢你!!Python硒的下载文件
PS。因为您可以看到该网站需要身份验证。
这里是我当前的代码:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import unittest
import os
class LoginTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.get("myinitialurl")
def test_Login(self):
driver=self.driver
emailFieldID="userNameInput"
passFieldID="passwordInput"
loginButtonID="submitButton"
BBButton="(//a[contains(@href,'blackboard')])"
coursebutton="(//a[contains(@href,'Course&id=_4572_1&url')])[1]"
docbutton="(//a[contains(@href,'content_id=_29867_1')])"
conbutton="(//a[contains(@href,'content_id=_29873_1')])"
paperbutton="(//a[contains(@href,'/xid-26243_1')])"
emailFieldElement=WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id(emailFieldID))
passFieldElement=WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id(passFieldID))
loginButtonElement=WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id(loginButtonID))
emailFieldElement.clear()
emailFieldElement.send_keys("username")
passFieldElement.clear()
passFieldElement.send_keys("password")
loginButtonElement.click()
BBElement=WebDriverWait(driver,50).until(lambda driver:driver.find_element_by_xpath(BBButton))
BBElement.click()
WebDriverWait(driver, 50).until(lambda driver: len(driver.window_handles) == 2)
window_after = driver.window_handles[1]
driver.switch_to.window(window_after)
courseElement=WebDriverWait(driver,50).until(lambda driver:driver.find_element_by_xpath(coursebutton))
courseElement.click()
后,通常要开设网站上的PDF文件和拨号框。我想下载该文件。
set.preference的代码,我发现如下:
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preferenc("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("url")
browser.find_element_by_partial_link_text("button").click()
所以我的问题是如何在第二部分中第一代码集成,以便下载由最后点击触发的内容。
否则,你有其他更简单的解决方案?
非常感谢!
解释你的意思'我不能直接与set.preference在program'年初设定的网址?不需要在首选项中指定任何“URL”,但是需要下载文件的默认文件夹,它是“MIME”类型。您可以在您的代码中随时随地使用'driver.get(URL)'并根据需要多次使用 – Andersson
谢谢您的回答。是的,我刚刚意识到这一点。但我仍然不明白的是如何将set.preference代码集成到第一部分,以便下载最后一次点击后显示的内容(pdf文件) – SXC88
您可以将'Profile'定义添加到'setUp'并且使用'self.driver = webdriver.Firefox(firefox_profile = fp)'而不是'self.driver = webdriver.Firefox()' – Andersson