Robot Framework + SeleniumLibraryで、Headless Firefoxを動かす

この記事は「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を動かしてみます。

 
目次

 

環境

 

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() メソッドが追加されていました。

 
そのため、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を使って、GooglePythonを検索してスクリーンショットを撮ってみます。

*** 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ですが、問題なくスクリーンショットが撮れています。

f:id:thinkAmi:20171205211805p:plain

 
昨日のChromeと比べて撮影されている範囲が広くなっています。スクリーンショットはブラウザにより違いますね。

 

ソースコード

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