Python3で動く、Robot Framework の SeleniumLibrary 3.0 リリースについて

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

 
今回は、Robot FrameworkでSeleniumを扱うライブラリ SeleniumLibrary の3.0のリリースについてです。

2017/12/10追記

SeleniumLibrary 3.0.0にはバグがあったようで、現在は 3.0.1 がリリースされています。
https://groups.google.com/forum/#!topic/robotframework-users/qsZjh__Tq4k

2017/12/10追記 ここまで

目次

 

今までのSelenium2Library 1.8.0について

Robot FrameworkからSeleniumを使う時、今までは Selenium2Library のリリース版である 1.8.0 を使ってきました。

そのため、テストコードで

*** Settings ***
Library  Selenium2Library

と、Selenium2Libraryを参照していました。

 
ただ、Selenium2Library 1.8.0 はPython2では動作するものの、Python3系に対応していません。そのため、Python3の環境にインストールしようとするとエラーになっていました。

# バージョン確認
(env_sl2_18) $ python --version
Python 3.6.3

# pipでインストール
(env_sl2_18) $ pip install robotframework-selenium2library
Collecting robotframework-selenium2library
  Using cached robotframework-selenium2library-1.8.0.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-build-tstkfayi/robotframework-selenium2library/setup.py", line 7, in <module>
        from ez_setup import use_setuptools
      File "/private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-build-tstkfayi/robotframework-selenium2library/src/ez_setup.py", line 106
        except pkg_resources.VersionConflict, e:
                                            ^
    SyntaxError: invalid syntax
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-build-tstkfayi/robotframework-selenium2library/

 

SeleniumLibrary 3.0 について

とはいえ、Python3系に対応するSeleniumLibraryの開発も行われていました。そして、2017/12/1に3.0.0がリリースされました。

 
3.0.0のリリースでの変更点は以下の通りです。

 
なお、SeleniumLibrary は昔も存在していたようですが、そのあたりの話は以下にまとまっています。
https://github.com/robotframework/SeleniumLibrary#history

 

過去のテストコードの扱いについて

気になるのが、過去のテストコードの扱いです。

そこで、SeleniumLibraryとSelenium2Libraryを参照しているテストコードをそれぞれ用意して試してみます。

selenium_library.robot

こちらはSeleniumLibraryを参照しています。

*** Settings ***
Library  SeleniumLibrary

*** Test Cases ***
ChromeでGoogleを開く
    Open Browser  https://google.co.jp  Chrome

 
selenium2_library.robot

こちらはSelenium2Libraryを参照しています。

*** Settings ***
Library  Selenium2Library

*** Test Cases ***
ChromeでGoogleを開く
    Open Browser  https://google.co.jp  Chrome

 

SeleniumLibrary 3.0での実行結果

SeleniumLibrary 3.0.0で両方のテストコードを流してみます。

(env_sl) $ python --version
Python 3.6.3

# SeleniumLibrary 3.0.0のインストール
(env_sl) $ pip install robotframework-seleniumlibrary
Collecting robotframework-seleniumlibrary
  Using cached robotframework_seleniumlibrary-3.0.0-py2.py3-none-any.whl
Collecting selenium>=2.53.6 (from robotframework-seleniumlibrary)
  Using cached selenium-3.8.0-py2.py3-none-any.whl
Collecting robotframework>=2.8.7 (from robotframework-seleniumlibrary)
  Using cached robotframework-3.0.2.tar.gz
Installing collected packages: selenium, robotframework, robotframework-seleniumlibrary
  Running setup.py install for robotframework ... done
Successfully installed robotframework-3.0.2 robotframework-seleniumlibrary-3.0.0 selenium-3.8.0

# selenium_library.robot を実行 => 成功
(env_sl) $ robot selenium_library.robot 
================
Selenium Library                                  
================
ChromeでGoogleを開く   | PASS |
----------------------
Selenium Library     | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
================

# selenium_library.robot を実行 => エラー
$ robot selenium2_library.robot 
[ ERROR ] Error in file '/path/to/selenium2_library.robot': Importing test library 'Selenium2Library' failed: ModuleNotFoundError: No module named 'Selenium2Library'
Traceback (most recent call last):
  None
PYTHONPATH:
...
================
Selenium2 Library                                                             
================
ChromeでGoogleを開く  | FAIL |
No keyword with name 'Open Browser' found.
----------------------
Selenium2 Library     | FAIL |
1 critical test, 0 passed, 1 failed
1 test total, 0 passed, 1 failed
================

Selenium2Libraryを参照している方がエラーとなり、過去のテストが通らなくなりました。

 

Selenium2Library 3.0 での実行結果

Selenium2Library時代のテストコードを直さないといけないのかと思いましたが、READMEを読むと、

Those migrating from Selenium2Library can install SeleniumLibrary so that it is exposed also as Selenium2Library:

pip install --pre --upgrade robotframework-selenium2library

The above command installs the normal SeleniumLibrary as well as a new Selenium2Library version that is just a thin wrapper to SeleniumLibrary. That allows importing Selenium2Library in tests while migrating to SeleniumLibrary.

とありました。

 
そこで、Selenium2Library 3.0をインストールし、試してみます。

# SeleniumLibraryの仮想環境を抜ける
(env_sl) $ deactivate

# 仮想環境を作って有効化
$ python -m venv env_sl2_30
$ source env_sl2_30/bin/activate
(env_sl2_30) $ python --version
Python 3.6.3

# インストールする
(env_sl2_30) $ pip install --upgrade --pre robotframework-selenium2library
Collecting robotframework-selenium2library
  Downloading robotframework-selenium2library-3.0.0b1.tar.gz (68kB)
    100% |████████████████████████████████| 71kB 456kB/s 
Collecting selenium>=2.53.6 (from robotframework-selenium2library)
  Using cached selenium-3.8.0-py2.py3-none-any.whl
Collecting robotframework>=2.8.7 (from robotframework-selenium2library)
  Using cached robotframework-3.0.2.tar.gz
Collecting robotframework-seleniumlibrary>=3.0.0a1 (from robotframework-selenium2library)
  Using cached robotframework_seleniumlibrary-3.0.0-py2.py3-none-any.whl
Installing collected packages: selenium, robotframework, robotframework-seleniumlibrary, robotframework-selenium2library
  Running setup.py install for robotframework ... done
  Running setup.py install for robotframework-selenium2library ... done
Successfully installed robotframework-3.0.2 robotframework-selenium2library-3.0.0b1 robotframework-seleniumlibrary-3.0.0 selenium-3.8.0

# SeleniumLibraryを参照しているテストコードを実行するとパスする
(env_sl2_30) $ robot selenium_library.robot 
================
Selenium Library                                               
================
ChromeでGoogleを開く    | PASS |
----------------------
Selenium Library     | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
================

# Selenium2Libraryを参照しているテストコードを実行してもパスする
(env_sl2_30) $ robot selenium2_library.robot 
================
Selenium2 Library                                  
================
ChromeでGoogleを開く    | PASS |
----------------------
Selenium2 Library     | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
================

両方のテストがパスしました。

 
内容をみると、pip installにて

Successfully installed robotframework-3.0.2 robotframework-selenium2library-3.0.0b1 robotframework-seleniumlibrary-3.0.0 selenium-3.8.0

のように、SeleniumLibraryとSelenium2Libraryの両方がインストールされているようです。

これにより、Selenium2Libraryを参照している過去のテストコードがあったとしても、Python3系のSeleniumLibraryでテストできます。

 
とはいえ、Selenium2LibraryはSeleniumLibraryのラッパーであり、バージョンをよく見ると robotframework-selenium2library-3.0.0b1 とベータ版のようです。

そのため、新しいテストコードではSeleniumLibraryを参照するほうが良いでしょう。