我想在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