Robot Framework + SeleniumLibrary + Selenium3.8以降でHeadless Chromeを動かす

この記事は「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.pyset_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 Chromeset_headless() メソッドを使って起動するには、add_argment()メソッドと同じく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ですが、問題なくスクリーンショットが撮れています。

f:id:thinkAmi:20171205210839p:plain

 

ソースコード

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