Python selenium下载文件

时间:2016-11-10 10:32:19

标签: python selenium download

我想在Python中使用selenium来自动执行下载过程。但目前的问题是我实际上可以使用xpath找到正确的URL(pdf文件所在的位置),但由于操作系统拨号框,我无法下载文件。我找到了一些建议使用webdriver.FirefoxProfile().set.preference的解决方案。但是,由于我需要使用selenium多次点击网站才能到达正确的页面,因此我无法在程序开头直接使用set.preference设置网址。你能帮我把set.preference整合到我现有的程序中吗?非常感谢!!

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

所以我的问题是如何在第一个代码中集成第二部分,以便下载最后一次点击触发的内容。

否则,你有其他更简单的解决方案吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

尝试添加另外两个可能需要下载PDF文件的首选项:

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

答案 1 :(得分: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()

答案 2 :(得分:0)

import requests
audio_src = driver.find_element_by_tag_name('audio').get_property('src')
response = requests.get(audio_src, cookies={i['name']: i['value'] for i in driver.get_cookies()})
with open('f.mp3', 'wb') as f:
    f.write(response.content)