【问题标题】:How can I enable download a file using a headless chrome browser in robot framework?如何在机器人框架中使用无头 chrome 浏览器下载文件?
【发布时间】:2018-07-02 03:28:53
【问题描述】:

如何使用 chrome 开发工具中的 Page.setDownloadBehavior 进行传递,以便我可以使用以下代码设置 headless chrome 的下载行为?

    Create Chrome Browser
    [Arguments]    ${link_to_open}
    ${chrome_options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    ${prefs}=    Create Dictionary    download.default_directory=${DOWNLOADS_DIR}
   Call Method    ${chrome options}    add_argument    headless 
   Call Method    ${chrome options}    add_argument    disable-gpu
  Selenium2Library.Go To    ${link_to_open}

【问题讨论】:

    标签: robotframework headless-browser google-chrome-headless


    【解决方案1】:

    尝试在无头模式下使用 Chrome 下载文件时似乎存在“安全功能”。这将在Chromium issue tracker 中进一步讨论。这指向了 Downloading with chrome headless and selenium 的 StackOverflow 答案。在这个答案中,给出了一个 Python 示例 (GitHub),它可以轻松转换为机器人框架库:

    headless_download.py

    class headless_download(object):
    
        ROBOT_LIBRARY_VERSION = 1.0
    
        def __init__(self):
            pass
    
        def enable_download_in_headless_chrome(self, driver, download_dir):
            """
            there is currently a "feature" in chrome where
            headless does not allow file download: https://bugs.chromium.org/p/chromium/issues/detail?id=696481
            This method is a hacky work-around until the official chromedriver support for this.
            Requires chrome version 62.0.3196.0 or above.
            """
    
            # add missing support for chrome "send_command"  to selenium webdriver
            driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
    
            params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}}
            command_result = driver.execute("send_command", params)
            print("response from browser:")
            for key in command_result:
                print("result:" + key + ":" + str(command_result[key]))
    

    下载文件时,Robot Framework Download File 的 StackOverlow 答案非常适合此示例。为无头模式、附加库和工作示例添加额外的行:

    headless_download.robot

    *** Settings ***
    Test Teardown     Close All Browsers
    Library           Selenium2Library
    Library           OperatingSystem
    Library           headless_download
    
    *** Test Cases ***
    Download PDF
      # create unique folder
      ${now}    Get Time    epoch
      ${download directory}    Join Path    ${OUTPUT DIR}    downloads_${now}
      Create Directory    ${download directory}
    
      ${chrome options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    
      # list of plugins to disable. disabling PDF Viewer is necessary so that PDFs are saved rather than displayed
      ${disabled}    Create List    Chrome PDF Viewer
      ${prefs}    Create Dictionary    download.default_directory=${download directory}    plugins.plugins_disabled=${disabled}
      Call Method    ${chrome options}    add_experimental_option    prefs    ${prefs}
    
      Call Method    ${chrome options}    add_argument    headless 
      Call Method    ${chrome options}    add_argument    disable-gpu
    
      Create Webdriver    Chrome    chrome_options=${chrome options}
    
      Go To    http://www.sample-videos.com/download-sample-text-file.php
    
      ${S2L}           get library instance    Selenium2Library
      ${webdriver}    Call Method             ${S2L}    _current_browser
      Enable Download In Headless Chrome    ${webdriver}    ${download directory} 
    
      Click Link    xpath=//a[@data='1']
    
      # wait for download to finish
      ${file}    Wait Until Keyword Succeeds    1 min    2 sec    Download should be done    ${download directory}
    
    *** Keywords ***
    Download should be done
      [Arguments]    ${directory}
      [Documentation]    Verifies that the directory has only one folder and it is not a temp file.
      ...
      ...    Returns path to the file
      ${files}    List Files In Directory    ${directory}
      Length Should Be    ${files}    1    Should be only one file in the download folder
      Should Not Match Regexp    ${files[0]}    (?i).*\\.tmp    Chrome is still downloading a file
      ${file}    Join Path    ${directory}    ${files[0]}
      Log    File was successfully downloaded to ${file}
      [Return]    ${file}
    

    所以,简而言之:如果没有其他人在 Stack Overflow 上的贡献,这个答案是不可能的。如果这为您提供了一个可行的解决方案,请点击其他答案的链接并为这些答案投票。

    【讨论】:

    • 嗨 A. Kootstra,我已经尝试了 python 调用,但我仍然不成功。我在日志上得到了这个:18:08:46.018 DEBUG POST 127.0.0.1:52532/session/c5aa448ceadbb7c41fb1de629a23283c/… {"sessionId": "c5aa448ceadbb7c41fb1de629a23283c", "params": {"downloadPath": "C:\\Temp\\Downloads", "behavior": "allow"}, "cmd": "Page.setDownloadBehavior"} 18:08:46.034 DEBUG Finished Request result:value:None result:status:0 这正常吗?它仍然无法下载。有人可以帮帮我吗?
    • 您运行的是哪个版本的 Selenium(2)Library、Selenium Python Module 和 Webdriver。这是按原样运行示例的错误,还是您根据自己的需要对其进行了修改?
    • 刚刚尝试了下面的示例,但我正在从我公司的 Intranet/内部 Web 应用程序上下载。
    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2018-03-30
    • 2018-04-01
    • 2016-05-19
    • 2022-01-22
    • 2013-02-07
    相关资源
    最近更新 更多