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