この記事は「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