【问题标题】:Python - Can't download file after opening a new tab using seleniumPython - 使用硒打开新标签后无法下载文件
【发布时间】:2019-08-12 16:19:53
【问题描述】:

我需要使用 chrome 和 selenium 从网站下载 xls 文件。我需要访问多个网站,因此我需要打开新标签。但是,当我打开第二个选项卡时,我无法下载我需要的文件。以下是我的代码的简单版本。我刚刚从一个选项卡下载了一些文件然后使用window.open() 打开一个新文件的图像:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions() 
prefs = {'download.default_directory' : SAVE_PATH, "download.prompt_for_download": False}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path = DRIVE_PATH, chrome_options = options)

driver.execute_script("window.open('https://www.fhfa.gov/DataTools/Downloads/Pages/House-Price-Index-Datasets.aspx#mpo');") 
time.sleep(5)
driver.switch_to.window(driver.window_handles[1]) 
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='WebPartWPQ2']/div[1]/table[3]/tbody/tr[2]/td[2]/p/a"))).click()

无需打开新标签,我就可以成功下载文件。但打开新标签后,chrome 告诉我“失败 - 下载错误”。我的代码有问题吗?

【问题讨论】:

    标签: selenium google-chrome download webdriver


    【解决方案1】:

    MacOS、Chrome 版本 76.0.3809.100、ChromeDriver 版本 75.0.3770.140 两种方式都下载成功。
    为了更好地找到下载链接以使用下面的,您可以找到有关定位器策略的更多信息here

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href*='HPI_PO_summary.xls']"))).click()
    

    更快的方法是使用https://www.fhfa.gov/下载文件,示例如下:

    import requests
    import os
    
    file_name = "HPI_PO_summary.xls"
    response = requests.get(f'https://www.fhfa.gov/DataTools/Downloads/Documents/HPI/{file_name}')
    
    with open(os.path.join(SAVE_PATH, file_name), 'wb') as f:
        f.write(response.content)
    

    【讨论】:

    • 谢谢Sers。 requests 方法效果很好。在 selenium 方法上,似乎从 XPATH 切换到 CSS_SELECTOR 并不能解决它——仍然有相同的错误消息。我正在使用最新的版本。不确定是不是某些 Chrome 设置会调用错误消息?
    【解决方案2】:

    在这里回答我的问题:

    看来问题出在 SAVE_PATH 中。最初我的 SAVE_PATH 是:

    r"C:\Users\hw\Desktop\myfile\"
    

    并且由于某种原因,如果我在路径末尾再添加一个斜杠,它会起作用(基于答案 here):

    r"C:\Users\hw\Desktop\myfile\\"
    

    【讨论】:

      猜你喜欢
      • 2019-08-24
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多