この記事は「Robot Framework Advent Calendar 2017 - Qiita」の6日目の記事です。
昨日はRobot Framework + SeleniumLibraryで Headless Chromeを動かしました。
Robot Framework + SeleniumLibrary + Selenium3.8以降でHeadless Chromeを動かす - メモ的な思考的な
そんな中、FirefoxでもHeadlessが実装されたと聞きました。LinuxはFirefox55から、Mac/WindowsはFirefox56から動作するようです。
ヘッドレスモード - Mozilla | MDN
そこで今回、Robot Framework + SeleniumLibraryで Headless Firefoxを動かしてみます。
目次
環境
- Firefox 57.0.1
- geckodriver 0.19.1
- Robot Framework 3.0.2
- SeleniumLibrary 3.0.0
- Python 3.6.3
- selenium 3.8.0
HeadlessなFirefoxを起動するには
MDNのドキュメントに従い、
${binary} = Evaluate sys.modules['selenium.webdriver.firefox.firefox_binary'].FirefoxBinary() sys
Call Method ${binary} add_command_line_options -headless
Create Webdriver Firefox firefox_binary=${binary}
と実装してみましたが、非HeadlessなFirefoxが起動しました。
仕方ないので他の方法を探してみたところ、以下のページに FirefoxOptions を使う方法が記載されていました。
selenium - Running headless Firefox WebDriver on Jenkins (Windows OS) - Stack Overflow
そのため、
${options} = Evaluate sys.modules['selenium.webdriver.firefox.options'].Options() sys
Call Method ${options} add_argument -headless
Create Webdriver Firefox firefox_options=${options}
としたところ、HeadlessなFirefoxが起動しました。
さらに、selenium 3.8.0より、Firefoxのoptions.pyにも set_headless() メソッドが追加されていました。
- https://github.com/SeleniumHQ/selenium/blob/selenium-3.8.0/py/selenium/webdriver/firefox/options.py#L122
- 2017/11/17のコミットで追加された模様
そのため、selenium 3.8.0からは、以下の方法でもHeadless Firefoxを起動できます。
${options} = Evaluate sys.modules['selenium.webdriver.firefox.options'].Options() sys
Call Method ${options} set_headless
Create Webdriver Firefox firefox_options=${options}
Headless Firefoxを試してみる
Headless Chromeと同様、Headless Firefoxを使って、GoogleでPythonを検索してスクリーンショットを撮ってみます。
*** 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なFirefoxを起動する
set_headlessメソッドがない場合はテストをパスする
${options} = Evaluate sys.modules['selenium.webdriver.firefox.options'].Options() sys
Call Method ${options} set_headless
Create Webdriver Firefox firefox_options=${options}
add_argumentメソッドを使ってHeadlessなFirefoxを起動する
${options} = Evaluate sys.modules['selenium.webdriver.firefox.options'].Options() sys
Call Method ${options} add_argument -headless
Create Webdriver Firefox firefox_options=${options}
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
# Googleのトップ画面を開く
Go To https://www.google.co.jp/
# タイトルにGoogleが含まれていることを確認する
${page_title} = Get Title
Should Contain ${page_title} Google
# 検索後を入力して送信する
Input Text name=q Python
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_python.png
# ログを見やすくするために改行を入れる
Log To Console ${SPACE}
# 検索結果を表示する
@{web_elements} = Get Webelements css=h3 > a
:For ${web_element} In @{web_elements}
\ ${text} = Get Text ${web_element}
\ Log To Console ${text}
\ ${href} = Call Method ${web_element} get_attribute href
\ Log To Console ${href}
# ブラウザを終了する
Close Browser
*** TestCases ***
add_argumentメソッドを使ってHeadlessなFirefoxを起動しテストする
add_argumentメソッドを使ってHeadlessなFirefoxを起動する
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
set_headlessメソッドを使ってHeadlessなFirefoxを起動しテストする
set_headlessメソッドを使ってHeadlessなFirefoxを起動する
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
実行結果
実行ログ
両方ともテストをパスしました。
$ robot test_google_with_headless_firefox.robot ============================= Test Google With Headless Firefox ============================= add_argumentメソッドを使ってHeadlessなFirefoxを起動しテストする . 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 3を使うべきでない場合(なんてない) | プログラミング | POSTD http://postd.cc/case-python-3/ Pythonとは?何に使えるの?Pythonの特徴や使い道を…|Udemy メディア https://udemy.benesse.co.jp/development/python.html Pythonは今のうちに習得すべき?『スラスラわかるPython』著者・岩崎さんと ... https://codezine.jp/article/detail/10329 add_argumentメソッドを使ってHeadlessなFirefoxを起動しテストする | PASS | ---------------------------------------- set_headlessメソッドを使ってHeadlessなFirefoxを起動しテストする . 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 3を使うべきでない場合(なんてない) | プログラミング | POSTD http://postd.cc/case-python-3/ Pythonとは?何に使えるの?Pythonの特徴や使い道を…|Udemy メディア https://udemy.benesse.co.jp/development/python.html Pythonは今のうちに習得すべき?『スラスラわかるPython』著者・岩崎さんと ... https://codezine.jp/article/detail/10329 set_headlessメソッドを使ってHeadlessなFirefoxを起動しテストする | PASS | ---------------------------------------- Test Google With Headless Firefox | PASS | 2 critical tests, 2 passed, 0 failed 2 tests total, 2 passed, 0 failed =============================
スクリーンショット
Headless Firefoxですが、問題なくスクリーンショットが撮れています。

昨日のChromeと比べて撮影されている範囲が広くなっています。スクリーンショットはブラウザにより違いますね。
ソースコード
GitHubに上げました。 selenium_firefox_headless_sample ディレクトリの test_google_with_headless_firefox.robot ファイルが今回のものです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples