Mac/Windowsでゼロから始めるRobot Framework + SeleniumLibrary

この記事は「Robot Framework Advent Calendar 2017 - Qiita」の3日目の記事です。

 
Robot Frameworkはドキュメントが充実しているため、きちんと読めばゼロから始められます。

ただ、ドキュメント量が多いため、最初のテストコードを書くまでに時間がかかるかもしれません。

そのため、今回はドキュメントへの参照リンクを付けながら、Mac/Windowsでゼロから始めるRobot Framework + SeleniumLibraryのテストコードを書いていきます。

目次

 

環境構築

Robot Framework + Selenium Library を使うためには、以下が必要です。

 
順番に準備します。

 

Python3のインストール

Robot Frameworkを動かすためには、Pythonが必要です。

今のところRobot FrameworkはPython2/3のどちらでも動きますが、今回はPython3を使います。

MacWindowsPythonをインストールする方法は、Python Boot Campのドキュメントに書かれていますので、そちらを参照してインストールしてください。
1. Pythonをはじめる前に — Python Boot Camp Text 2016.04.28 ドキュメント

 

今回使用するディレクトリの準備

任意の場所にディレクトリを用意しておきます。

今回は hello_robot ディレクトリの中で作業します。

# ディレクトリの作成
mkdir hello_robot

# 移動
cd hello_robot

 

Pythonのvenv環境の構築

先ほどインストールしたPython環境にRobot Frameworkを入れてもよいです。

ただ、他でもPython環境を使う可能性があるため、今回はvenvを使ってPythonの仮想環境にRobot Frameworkを入れることにします。

Python Boot Campのテキストを参考に、venv環境を作り、有効化(activate)しておきます。
6.2. venvとは - 6. サードパーティ製パッケージと venv — Python Boot Camp Text 2016.04.28 ドキュメント

 

# venv環境を、rfenvという名前で作成
python -m venv rfenv

# 有効化
## Mac
$ source rfenv/bin/activate
## Windows
>rfenv\Scripts\activate.bat


# 有効化されている
(rfenv) $ 
(rfenv) >

 

Robot FrameworkとSeleniumLibraryをインストール

本体をインストールします。

(rfenv) pip install robotframework-seleniumlibrary

Collecting robotframework-seleniumlibrary
  Using cached robotframework_seleniumlibrary-3.0.0-py2.py3-none-any.whl
Collecting robotframework>=2.8.7 (from robotframework-seleniumlibrary)
  Using cached robotframework-3.0.2.tar.gz
Collecting selenium>=2.53.6 (from robotframework-seleniumlibrary)
  Using cached selenium-3.8.0-py2.py3-none-any.whl
Installing collected packages: robotframework, selenium, robotframework-seleniumlibrary
  Running setup.py install for robotframework ... done
Successfully installed robotframework-3.0.2 robotframework-seleniumlibrary-3.0.0 selenium-3.8.0

 

ChromeDriverのインストール

今回はブラウザとしてChromeを使います。

ChromeSeleniumから操作するために、ChromeDriverをインストールします。現時点の最新版は、2.33です。

Macの場合はHomebrewでインストールします。

$ brew install chromedriver

 
Windowsの場合は、ChromeDriverをダウンロードします。
Downloads - ChromeDriver - WebDriver for Chrome

今回は簡単に使うだけなので、hello_robot ディレクトリに、解凍したchromedriver.exe を入れておきます。

 
以上で環境構築は完了です。

 

テストコードの作成

今回は以下のPython + Seleniumのテストコードの内容をRobot Frameworkで書いていきます。

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import unittest

class TestGoogle(unittest.TestCase):
    def test_GoogleでSeleniumLibraryを検索する(self):
        browser = Chrome()
        browser.get('https://google.co.jp')
        query_input = browser.find_element_by_name('q')
        query_input.send_keys('SeleniumLibrary' + Keys.ENTER)
        # 結果出力と検証
        links = browser.find_elements_by_css_selector('h3 > a')
        for link in links:
            print(link.text)
        self.assertEqual(len(links), 10)
        browser.quit()

 

テストコードのファイル形式の選択と作成

Robot Frameworkのテストコードのファイル形式については、公式ドキュメントの以下のページに記載があります。

 
以下のファイル形式が使えます。

  • HTML
  • TSV
  • プレーンテキスト (.robot, .txt)
  • reST

 
今回はWeb上でよく見かける、プレーンテキスト(拡張子は .robot )を使います。

なお、プレーンテキストの場合、

  • スペース区切り方式
  • スペース・パイプ区切り方式

のどちらかを選べますが、今回は前者のスペース区切り方式を選択します。

 
また、Robot Frameworkでは、テストデータテーブルという概念でテストコードを書きます。

 
テストデータテーブルは、以下の4つの区分で構成されます。

  • Settings
  • Variables
  • Test Cases
  • Keywords

それぞれの使い方については、後述します。

 
以上より、今回はテストコードをtest_selenium.robot として作成し、hello_robot ディレクトリの中に保存します。

ここまでのディレクトリ構成は以下の通りです。

hello_robot/
├── test_selenium.robot
├── chromedriver.exe (Windowsの場合のみ)
└── rfenv/

 
 

参照するライブラリの指定

Pythonのコードでは import でライブラリ(モジュール)を指定しています。

Robot Frameworkでも参照するライブラリを指定します。

今回はSettingsにて Library 設定を記述します。

*** Settings ***
Library  SeleniumLibrary

 

テストコードの実装

基本的な構文は以下に記載があります。

 

TestCaseとテストケースの記述

まずは、 TestCases とテストケース名を記述します。テストケース名には日本語を使用できます。

*** TestCases ***
GoogleでSeleniumLibraryを検索するテスト

 

テストケースの詳細を実装

続いてSeleniumを操作するキーワードを記述します。

SeleniumLibraryで使えるキーワードは公式ドキュメントを参照します。

まずは

# Chromeを起動する
browser = webdriver.Chrome()
# Googleへ遷移する
browser.get('https://google.co.jp')
# 検索枠に入力してEnterキーを押す
query_input = browser.find_element_by_name('q')
query_input.send_keys('SeleniumLibrary' + Keys.ENTER)

をRobot Frameworkで記述します。

Open Browser  https://google.co.jp  Chrome
Input Text  name=q  SeleniumLibrary
Press Key  name=q  \\13

ちなみに、\\13 については、SeleniumLibraryでEnterキーを押すためのコードです。
http://robotframework.org/SeleniumLibrary/SeleniumLibrary.html#Press%20Key

なお、Pythonと異なり、今のところ「SeleniumLibrary + Enterキー」を同時に入力する方法は実装されていません。
https://github.com/robotframework/SeleniumLibrary/issues/498

 
次に、メソッドを実行して変数として受け取る部分です。

links = browser.find_elements_by_css_selector('h3 > a')

Robot Frameworkの変数は以下に記載があります。

今回は、 ${} を使います。

${links} =  Get Webelements  css=h3 > a

 
続いて、forループと検証です。

for link in links:
    print(link.text)
self.assertEqual(len(links), 10)

 
Robot Frameworkでforループを使う場合は、以下に記述があります。

 
これによると、

のようです。

つまり、

:For  ${link}  In  @{links}
    \  ${text} =  Get Text  ${link}

となります。

 
次に、

  • コンソールに結果を出力 (print)
  • リンク数を検証 (self.assertEqual)

をRobot Frameworkで実装します。

これらはRobot Frameworkの組込みライブラリであるBuiltinライブラリにあるため、そちらのドキュメントを参照します。

 
それらは

    \  Log To Console  ${text}
Length Should Be  ${links}  10

となります。

 
最後にブラウザを閉じる(browser.quit())です。

Close Browser

 
これで全体ができました。test_selenium.robot全体のソースコードは以下の通りです。

*** Settings ***
Library  SeleniumLibrary

*** TestCases ***
GoogleでSeleniumLibraryを検索するテスト
    Open Browser  https://google.co.jp  Chrome
    Input Text  name=q  SeleniumLibrary
    Press Key  name=q  \\13
    # 結果出力と検証
    ${links} =  Get Webelements  css=h3 > a
    :For  ${link}  In  @{links}
        \  ${text} =  Get Text  ${link}
        \  Log To Console  ${text}
    Length Should Be  ${links}  10
    Close Browser

 

テストの実行

Python + Seleniumの場合、以下のように実行します。

(rfenv) $ python -m unittest test_selenium.py 
GitHub - robotframework/SeleniumLibrary: Web testing library for ...
SeleniumLibrary - Robot Framework
robotframework-seleniumlibrary 3.0.0rc2 : Python Package Index - PyPI
Python3で動く、Robot Framework の SeleniumLibrary 3.0 のリリース ...
RobotFrameworkのSelenium2Libraryの名前が、SeleniumLibraryへと ...
robotframework-seleniumlibrary - Demo.wiki - Google Code Archive ...
Maven Repository: org.jboss.test.richfaces-selenium.library
Selenium with Python — Selenium Python Bindings 2 documentation
Selenium IDE: RobotFramework Formatter :: レビュー :: Firefox 向け ...
Selenium - Web Browser Automation
.
----------------------------------------------------------------------
Ran 1 test in 8.426s

OK

 
Robot Frameworkの場合、 robot コマンドで実行します。

(rfenv) $ robot test_selenium.robot 
==================
Hello Selenium                                                                
==================
GoogleでSeleniumLibraryを検索するテスト                               ....
GitHub - robotframework/SeleniumLibrary: Web testing library for ...
SeleniumLibrary - Robot Framework
Python3で動く、Robot Framework の SeleniumLibrary 3.0 のリリース ...
RobotFrameworkのSelenium2Libraryの名前が、SeleniumLibraryへと ...
robotframework-seleniumlibrary 3.0.0rc2 : Python Package Index - PyPI
robotframework-seleniumlibrary 2.8.1 : Python Package Index
robotframework-seleniumlibrary 3.0.0a1 : Python Package Index
robotframework-seleniumlibrary - Demo.wiki - Google Code Archive ...
Maven Repository: org.jboss.test.richfaces-selenium.library
Selenium with Python — Selenium Python Bindings 2 documentation
GoogleでSeleniumLibraryを検索するテスト                               | PASS |
-------------------------
Hello Selenium                                                        | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==================
Output:  /path/to/hello_robot/output.xml
Log:     /path/to/hello_robot/log.html
Report:  /path/to/hello_robot/report.html

 
実行後、ログファイルが出力されましたので、それぞれ確認してみます。

log.html

f:id:thinkAmi:20171203091918p:plain

report.html

f:id:thinkAmi:20171203091933p:plain

 

テストコードを修正する

上記のテストコードでは、テストデータテーブルの

  • Variables
  • Keywords

を使っていなかったため、それを使うように修正してみます。

 

Variablesを使う

Variablesは、変数を事前に定義する時に使います。

 
こんな感じで定義します。

*** Variables ***
${検索キーワード}  SeleniumLibrary

 
定義した変数 ${検索キーワード} を使うように修正します。

# Input Text  name=q  SeleniumLibrary
Input Text  name=q  ${検索キーワード}

 

Keywordsを使う

Keywordsは、自作のキーワード(ユーザーキーワード)を作成する時に使います。

 
こんな感じで定義します。

*** Keywords ***
Chromeを起動する
    Open Browser  https://google.co.jp  Chrome

 
定義したキーワードを使うように変更します。

# Open Browser  https://google.co.jp  Chrome
Chromeを起動する

 
テストの全体は以下となりました。

*** Settings ***
Library  SeleniumLibrary

*** Variables ***
${検索キーワード}  SeleniumLibrary


*** Keywords ***
Chromeを起動する
    Open Browser  https://google.co.jp  Chrome


*** TestCases ***
GoogleでSeleniumLibraryを検索するテスト
    Open Browser  https://google.co.jp  Chrome
    Input Text  name=q  SeleniumLibrary
    Press Key  name=q  \\13
    # 結果出力と検証
    ${links} =  Get Webelements  css=h3 > a
    :For  ${link}  In  @{links}
        \  ${text} =  Get Text  ${link}
        \  Log To Console  ${text}
    Length Should Be  ${links}  10
    Close Browser


GoogleでSeleniumLibraryを検索するテスト2
    Chromeを起動する
    Input Text  name=q  ${検索キーワード}
    Press Key  name=q  \\13
    # 結果出力と検証
    ${links} =  Get Webelements  css=h3 > a
    :For  ${link}  In  @{links}
        \  ${text} =  Get Text  ${link}
        \  Log To Console  ${text}
    Length Should Be  ${links}  10
    Close Browser

 
以上が、ひと通りの流れとなります。

 

その他資料

BuitInライブラリやSeleniumLibraryのその他の書き方については、以下にも書きました。

 

ソースコード

GitHubに上げました。 selenium_getting_started ディレクトリの中が、今回のファイルです。
https://github.com/thinkAmi-sandbox/RobotFramework-sample