【问题标题】:Fail to download file with opened new tab in headless mode on Linux在 Linux 上以无头模式打开新选项卡时无法下载文件
【发布时间】:2020-01-10 06:59:43
【问题描述】:

作为我自己的答案: How to download files headless in Selenium (Java) when download happens in new tab?

如果下载按钮在打开的新标签中触发下载动作,我将切换到新标签并发送命令(如下代码)下载文件。

def enable_download_in_headless_chrome(self, driver, download_path):
    driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
    params = {
        'cmd': 'Page.setDownloadBehavior',
        'params': {'behavior': 'allow', 'downloadPath': download_path}
    }

    driver.execute("send_command", params)

我发现上面的方法在linux上偶尔会失败。

当驱动程序收到错误时,它会崩溃很长时间。 (我通过重试错误处理来检测情况。)

错误信息:

消息:超时
(会话信息:headless chrome=77.0.3865.120)

我已经通过问题讨论查看了解决方案,但没有人能解决它:https://bugs.chromium.org/p/chromium/issues/detail?id=696481

我想根本原因是我在新标签就绪状态之前发送了启用下载命令?

请帮助我找到解决方案。谢谢。

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    如果在您单击下载链接时打开了一个新选项卡(例如,如果它具有 target="_blank" 属性)。在这种情况下,使用 enable_download_in_headless_chrome 方法以无头方式下载,解决方案不起作用。所以可以通过JS去掉target="_blank"属性或者获取href,直接在同一个标​​签页打开链接尝试下载。

    如果有链接并在新选项卡中打开,那么您可以通过覆盖 javascript 在同一选项卡中打开

    def open_link_same_tab_download_file(current_user_driver, element):
        # open element in same tab add target to self
        current_user_driver.execute_script('arguments[0].target="_self"',element)
    
        # click on element to download file
        current_user_driver.execute_script("arguments[0].click()", element
    

    如果没有链接属性,那么您可以在新标签中覆盖打开窗口的 javascript,如下所示

    def open_new_tab_download_file(current_user_driver, element):
        # open element in same tab override javascript for that
        current_user_driver.execute_script('window.open = function(url) {window.location=url}')
    
        # click on element to download file
        current_user_driver.execute_script("arguments[0].click()", element)
    

    【讨论】:

    • 非常感谢。但下载按钮元素不包含链接和属性“目标”。
    • @Yun 请按照上面编辑的答案。您可以在同一选项卡中为打开的窗口覆盖 js。
    • 我试过了。它比我的方法更稳定。非常感谢!
    【解决方案2】:

    在 Linux 上, 我发现文件会通过下面的代码下载两次:

    # Open new tab by clicking download button
    download_button.click()
    # Switch to new tab
    driver.switch_to.window(driver.window_handles[-1])
    # Wait for ready state 
    WebDriverWait(driver, 60).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
    
    ##### The file will be downloaded to original download path ##### 
    
    # Change download directory
    enable_download_in_headless_chrome(driver, download_path)
    # Refresh to trigger download behavior again
    driver.refresh()
    
    ##### The file will be downloaded to your specific path again #####
    

    如果在就绪状态之前发送“启用下载”命令, 它无法成功更改下载目录。

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2020-03-31
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2017-01-28
      • 2012-03-17
      相关资源
      最近更新 更多