2016-11-10 95 views
0

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

所以我的問題是如何在第二部分中第一代碼集成,以便下載由最後點擊觸發的內容。

否則,你有其他更簡單的解決方案?

非常感謝!

+0

解釋你的意思'我不能直接與set.preference在program'年初設定的網址?不需要在首選項中指定任何「URL」,但是需要下載文件的默認文件夾,它是「MIME」類型。您可以在您的代碼中隨時隨地使用'driver.get(URL)'並根據需要多次使用 – Andersson

+0

謝謝您的回答。是的,我剛剛意識到這一點。但我仍然不明白的是如何將set.preference代碼集成到第一部分,以便下載最後一次點擊後顯示的內容(pdf文件) – SXC88

+0

您可以將'Profile'定義添加到'setUp'並且使用'self.driver = webdriver.Firefox(firefox_profile = fp)'而不是'self.driver = webdriver.Firefox()' – Andersson

回答

1

嘗試添加兩個,你可能需要下載文件PDF喜好:

fp.set_preference("pdfjs.disabled", True) 
fp.set_preference("plugin.disable_full_page_plugin_for_types", "application/pdf") 
+0

太棒了!它工作!非常感謝!但我仍然有另一個問題禁用Firefox的操作系統彈出窗口,但我會問一個新的帖子;) – SXC88

+0

這裏是帖子,如果你想看看:)) – SXC88

+0

http://stackoverflow.com/questions/40531436/python-selenium-distable -os-彈出窗口 – SXC88

0
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
import unittest 
import os 




class LoginTest(unittest.TestCase): 
def setUp(self): 

    fp=webdriver.FirefoxProfile() 

    fp.set_preference("browser.download.folderList",2) 
    fp.set_preference("browser.download.manager.showWhenStarting",False) 
    fp.set_preference("browser.download.dir", "D://doc") 
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") 

    self.driver=webdriver.Firefox(firefox_profile=fp) 
    self.driver.get("myurl") 

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()