当前位置: 首页 > 知识库问答 >
问题:

如何在robot框架中启用使用无头chrome浏览器下载文件?

上官英哲
2023-03-14

我如何使用页面。在chrome开发工具中设置DownloadBehavior,以便我可以使用下面的代码设置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}

共有1个答案

须峰
2023-03-14

当尝试在无头模式下使用Chrome下载文件时,似乎有一个“安全功能”。这将在Chromium问题跟踪器中进一步讨论。这指向了使用铬无头和硒下载的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]))

下载文件时,机器人框架下载文件的StackOverlow答案完全符合此示例。添加无头模式的额外行,额外的库和一个工作示例:

无头下载。机器人

*** 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}

因此,简而言之:如果没有其他人对堆栈溢出的贡献,这个答案是不可能的。如果这为您提供了一个有效的解决方案,请按照其他答案的链接并对这些答案进行投票。

 类似资料:
  • 我的用例:我必须从pdf中读取数据,而不是在chrome浏览器中打开,并检查pdf中是否存在一些特定的数据。 由于我无法做到以上,我想到下载文件在我的电脑上,并使用PDFbox进行验证。我创建了一个chrome配置文件,带有直接下载pdf文件的设置(设置>内容设置>pdf文档)。我已经在我的selenium脚本中将其设置为chrome选项。测试工作,但当pdf打开时,它不会开始下载。PDF文件在我

  • 请有人帮我解决这个问题。提前道谢。当运行java代码在模拟器中打开chrome浏览器时,我收到“无法启动Chromedriver会话:无法创建新会话。详细信息:未创建会话:此版本的Chromedriver仅支持chrome 83版”错误消息。

  • 线程“main”java.lang.IllegalStateException中的异常:驱动程序可执行文件的路径必须由WebDriver.Chrome.driver系统属性设置;有关更多信息,请参见https://github.com/seleniumhq/selenium/wiki/chromedriver。最新版本可从http://chromedriver.storage.googleapis

  • 我想将JSTestDriver与jenkins-CI集成。问题是生成服务器没有显示。有没有办法无头运行浏览器? 谢谢

  • 问题内容: 抱歉,您有愚蠢的问题,但是如何在webdriver中启动Chrome浏览器?我知道我必须指定chromedriver.exe的路径。问题是我无法下载chromedriver.exe,它已被删除。我发现的文件也没有.exe扩展名。我正在使用Eclipse,Java。请帮忙!我按照建议的步骤进行了所有操作,但是没有用。这是我的代码: 这是错误: 失败:测试java.lang.Illegal

  • 我需要在chrome浏览器上模拟文件下载,下面的链接指向我正在寻找的解决方案。 http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/ https://github.com/Ardesco/Ebselen/blob/master/ebselen

  • 使用: Angular CLI在Chrome中默认运行测试,这很好,但是如果我需要在仅控制台环境(无头浏览器)中运行它们呢? 如果我可以在每次运行它时指定是否想要无浏览器,那就太好了,所以类似于: 编辑: 运行PhantomJS我得到了以下信息: PhantomJS 2.1.1 (Linux 0.0.0)错误类型错误:useValue,useFactory,数据不可迭代!http://localh

  • 在我的php文件中,我有以下内容来创建一个带有FPDF库的PDF: 但是请求是响应这个,而不是打开一个保存对话框来保存我的PDF。 %PDF-1.3 3 0 obj<>endobj 4 0 obj<>stream x 3 R@2π35 W(çR qπw 3 t04多30 pispéz*[(hx·ääää+çó)·(j*dé7 w endstream endobj 1 0 obj /xobject<