I\'m trying to run chrome headless with my robot framework tests suites. I managed to do it independtly with python using selenium as follows:
options = webd
${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
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
You can now use aliases:
*** Settings ***
Library SeleniumLibrary
*** Test Cases ***
Firefox
Open Browser http://robotframework.org/ headlessfirefox
Capture Page Screenshot
[Teardown] Close All Browsers
Chrome
Open Browser http://robotframework.org/ headlesschrome
Capture Page Screenshot
[Teardown] Close All Browsers
See https://github.com/robotframework/SeleniumLibrary/pull/1011
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
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.
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}