この記事は「Robot Framework Advent Calendar 2017 - Qiita」の5日目の記事です。
以前、 Selenium2Library 時代にHeadless Chromeを使ってみました。
Robot FrameworkでHeadless Chromeを使ってみた - メモ的な思考的な
その後、
SeleniumLibraryにライブラリ名が変わった- Seleniumのバージョンが上がって、便利なメソッドができていた
となったため、改めて Robot Framework + SeleniumLibraryで Headless Chromeを動かしてみます。
目次
環境
- Python 3.6.3
- Chrome 62.0.3202.94
- chromedriver 2.33
- RobotFramework 3.0.2
- SeleniumLibrary 3.0.0
- selenium 3.8.0
set_headless() メソッドを使う
Selenium 3.8より、 selenium.webdriver.chrome.options.py に set_selenium() メソッドが追加されていました。
https://github.com/SeleniumHQ/selenium/blob/selenium-3.8.0/py/selenium/webdriver/chrome/options.py#L161
ソースコードを読むと、ChromeOptiosにheadlessを設定してくれるようなので、今回はこれを使ってみます。
実装について
Headless Chromeを set_headless() メソッドを使って起動する
Headless Chromeを set_headless() メソッドを使って起動するには、add_argment()メソッドと同じくChromeOptionsクラスを使い、
- ChromeOptionsクラスをインスタンス化
- ChromeOptionsインスタンスの
set_headless()メソッドを実行 - Chromeを起動する際の
chrome_optionsに、ChromeOptionsクラスのインスタンスを渡す
を行います。
# ChromeOptionsクラスをインスタンス化
${options} = evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
# ChromeOptionsインスタンスの set_headless メソッドを実行
call method ${options} set_headless
create webdriver Chrome chrome_options=${options}
全体
add_argment() と set_headless() の両パターンを書いてみました。
*** Settings ***
Library SeleniumLibrary
*** Keywords ***
set_headlessメソッドがない場合はテストをパスする
${version} = evaluate selenium.__version__ selenium
${selenium_version} = evaluate importlib.import_module('distutils.version').LooseVersion($version) importlib
# set_headlessメソッドは、python seleniumの3.8.0以降に実装された
${min_version} = evaluate importlib.import_module('distutils.version').LooseVersion('3.8.0') importlib
Pass Execution If $selenium_version < $min_version seleniumが${min_version}以上でないと動作しません
set_headlessメソッドを使ってHeadlessなChromeを起動する
set_headlessメソッドがない場合はテストをパスする
${options} = evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
Call Method ${options} set_headless
Create Webdriver Chrome chrome_options=${options}
add_argumentメソッドを使ってHeadlessなChromeを起動する
# https://groups.google.com/d/msg/robotframework-users/gPsiVaMo19A/cBRH7mr2BAAJ
${options} = evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
Call Method ${options} add_argument --headless
Create Webdriver Chrome chrome_options=${options}
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
# 以下のコードをRobot Framework風にした
# http://qiita.com/orangain/items/db4594113c04e8801aad
# Googleのトップ画面を開く
Go To https://www.google.co.jp/
# タイトルにGoogleが含まれていることを確認する
${page_title} = get title
Should Contain ${page_title} Google
# 検索後を入力して送信する
Input Text name=q Python
# Robot FrameworkではEnterキーは\\13になる
# https://github.com/robotframework/Selenium2Library/issues/4
Press Key name=q \\13
# Ajax遷移のため、適当に2秒待つ
Sleep 2sec
# タイトルにPythonが含まれていることを確認する
${result_title} = get title
should contain ${result_title} Python
# スクリーンショットを撮る
Capture Page Screenshot filename=result_google_python2.png
# ログを見やすくするために改行を入れる
Log To Console ${SPACE}
# 検索結果を表示する
# ForでElementを回したかったことから、WebElementを取得し、そのAPIを利用する
# http://robotframework.org/Selenium2Library/Selenium2Library.html#Get%20Webelements
# https://stackoverflow.com/a/42508200
@{web_elements} = Get Webelements css=h3 > a
:For ${web_element} In @{web_elements}
\ ${text} = Get Text ${web_element}
\ Log To Console ${text}
# 以下を参考に、WebElementからattribute(href)を取得
# https://groups.google.com/d/msg/robotframework-users/xx3KYxpDu_w/0hyulqKPKQAJ
# http://seleniumhq.github.io/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webelement.html#selenium.webdriver.remote.webelement.WebElement.get_attribute
\ ${href} = Call Method ${web_element} get_attribute href
\ Log To Console ${href}
# ブラウザを終了する
Close Browser
*** TestCases ***
add_argumentメソッドを使ってHeadlessなChromeを起動しテストする
add_argumentメソッドを使ってHeadlessなChromeを起動する
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
set_headlessメソッドを使ってHeadlessなChromeを起動しテストする
set_headlessメソッドを使ってHeadlessなChromeを起動する
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
実行結果
実行ログ
両方ともテストをパスしました。
$ robot test_google_with_headless_chrome.robot ============================== Test Google With Headless Chrome ============================== add_argumentメソッドを使ってHeadlessなChromeを起動しテストする . Python - ウィキペディア https://ja.wikipedia.org/wiki/Python Pythonとは - python.jp https://www.python.jp/about/ 専門知識いらず!Pythonとは?言語の特徴から網羅的に徹底解説 | 侍 ... https://www.sejuku.net/blog/7720 Python基礎講座(1 Pythonとは) - Qiita https://qiita.com/Usek/items/ff4d87745dfc5d9b85a4 Python 13370 posts - Qiita https://qiita.com/tags/Python Python入門 http://www.tohoho-web.com/python/ Python | プログラミングの入門なら基礎から学べるProgate[プロゲート] https://prog-8.com/languages/python Pythonとは?何に使えるの?Pythonの特徴や使い道を…|Udemy メディア https://udemy.benesse.co.jp/development/python.html Python 3を使うべきでない場合(なんてない) | プログラミング | POSTD http://postd.cc/case-python-3/ Pythonは今のうちに習得すべき?『スラスラわかるPython』著者・岩崎さんと ... https://codezine.jp/article/detail/10329 add_argumentメソッドを使ってHeadlessなChromeを起動しテストする | PASS | ----------------------------------------- set_headlessメソッドを使ってHeadlessなChromeを起動しテストする . Python - ウィキペディア https://ja.wikipedia.org/wiki/Python Pythonとは - python.jp https://www.python.jp/about/ 専門知識いらず!Pythonとは?言語の特徴から網羅的に徹底解説 | 侍 ... https://www.sejuku.net/blog/7720 Python基礎講座(1 Pythonとは) - Qiita https://qiita.com/Usek/items/ff4d87745dfc5d9b85a4 Python 13370 posts - Qiita https://qiita.com/tags/Python Python入門 http://www.tohoho-web.com/python/ Python | プログラミングの入門なら基礎から学べるProgate[プロゲート] https://prog-8.com/languages/python Pythonとは?何に使えるの?Pythonの特徴や使い道を…|Udemy メディア https://udemy.benesse.co.jp/development/python.html Python 3を使うべきでない場合(なんてない) | プログラミング | POSTD http://postd.cc/case-python-3/ Pythonは今のうちに習得すべき?『スラスラわかるPython』著者・岩崎さんと ... https://codezine.jp/article/detail/10329 set_headlessメソッドを使ってHeadlessなChromeを起動しテストする | PASS | ----------------------------------------- Test Google With Headless Chrome | PASS | 2 critical tests, 2 passed, 0 failed 2 tests total, 2 passed, 0 failed ==============================
スクリーンショット
Headless Chromeですが、問題なくスクリーンショットが撮れています。

ソースコード
GitHubに上げました。 selenium_chrome_headless_sample ディレクトリの test_google_with_headless_chrome.robot ファイルが今回のものです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples