How to run headless REMOTE chrome using robot framework

瘦欲@ 提交于 2019-11-30 03:48:27

To run headless you need to set the arguments and convert them to capabilities so that they can be used when using the Remote Driver option. This works for both the Open Browser as well as the Create Webdriver way of navigating to a URL.

*** Settings ***
Library    Selenium2Library

Suite Teardown    Close All Browsers

*** Test Cases ***
Headless Chrome - Create Webdriver
    ${chrome options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    Call Method    ${chrome options}   add_argument    headless
    Call Method    ${chrome options}   add_argument    disable-gpu
    ${options}=     Call Method     ${chrome_options}    to_capabilities      

    Create Webdriver    Remote   command_executor=http://localhost:4444/wd/hub    desired_capabilities=${options}

    Go to     http://cnn.com

    Maximize Browser Window
    Capture Page Screenshot

Headless Chrome - Open Browser
    ${chrome_options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    Call Method    ${chrome_options}   add_argument    headless
    Call Method    ${chrome_options}   add_argument    disable-gpu
    ${options}=     Call Method     ${chrome_options}    to_capabilities     

    Open Browser    http://cnn.com    browser=chrome    remote_url=http://localhost:4444/wd/hub     desired_capabilities=${options}

    Maximize Browser Window
    Capture Page Screenshot

In newer versions of SeleniumLibrary (3.1.0) and Selenium (3.8.0) you can simply set the browser to headlesschrome instead of chrome.

There's also headlessfirefox available.

Ex.

Open Browser      http://www.yoursite.com    headlesschrome

http://robotframework.org/SeleniumLibrary/SeleniumLibrary.html#Open%20Browser

bsd007

Please try the below. Run the keyword in Test setup

Running the tests in chrome headless
    ${chrome options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    Call Method    ${chrome options}   add_argument    headless
    Call Method    ${chrome options}   add_argument    disable-gpu
    Create Webdriver    Chrome    chrome_options=${chrome options}

Try out these two keywords:

Open Chrome
    [Arguments]    ${url}    ${lang}
    ${chrome_options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    Call Method    ${chrome_options}    add_argument    headless
    Call Method    ${chrome_options}    add_argument    disable-gpu
    Create Webdriver    Chrome    chrome_options=${chrome_options}
    Go To    ${url}

Open Remote Chrome
    [Arguments]    ${url}    ${remote_url}    ${lang}
    ${chrome_options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    Call Method    ${chrome_options}    add_argument    headless
    Call Method    ${chrome_options}    add_argument    disable-gpu
    Open Browser    ${url}    Chrome    remote_url=${remote_url}    desired_capabilities=${chrome_options.to_capabilities()}

First one will launch a local chrome, while the second one is to launch a remote chrome. If you need to be able to handle the remote vs. local into a single keyword, you can create a wrapper around these two with a boolean argument that will determine which keyword to call.

${options}=  Evaluate  sys.modules['selenium.webdriver'].ChromeOptions()  sys, selenium.webdriver
Call Method    ${options}    add_argument    headless
Call Method    ${options}    add_argument    disable-gpu
Create WebDriver  Chrome  chrome_options=${options}
Goto  https://www.cnn.com/
Wait Until Page Contains    Politics today
Close Browser

I created example repository and instructions how to run Chrome and Firefox native, headless or with docker and also included comparison chart for run times. You can find examples on my github page https://github.com/shnigi/Docker-Headless-Testing-Demo

The main Idea is however In both tests to use the Selenium's webdriver API to tell chromedriver and geckodriver to launch browser with some arguments. SeleniumLibrary's Open Browser keyword does not have this functionality, but Create Webdriver does the trick.

Open Headless Chrome Browser to Page
  ${chrome_options}=    Evaluate    
  sys.modules['selenium.webdriver'].ChromeOptions()    sys
  Call Method    ${chrome_options}    add_argument    test-type
  Call Method    ${chrome_options}    add_argument    --disable-extensions
  Call Method    ${chrome_options}    add_argument    --headless
  Call Method    ${chrome_options}    add_argument    --disable-gpu
  Call Method    ${chrome_options}    add_argument    --no-sandbox
  Create Webdriver    Chrome    chrome_options=${chrome_options}
  Set Window Size    1920    1080
  Go To    ${PAGE URL}

Firefox true headless
  ${firefox options}=     Evaluate    sys.modules['selenium.webdriver'].firefox.webdriver.Options()    sys, selenium.webdriver
  Call Method    ${firefox options}   add_argument    -headless
  Create Webdriver    Firefox    firefox_options=${firefox options}
  Set Window Size    1920    1080
  Go To    ${PAGE URL}
  Page Should Be Open

You will need latest browsers and drivers installed.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!