2016-11-10 81 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()