2019年12月21日土曜日

UbuntuでSelenium Serverを通して作ったFirefoxのセッションを使いまわす方法


背景

Seleniumとは、ブラウザの操作をプログラムで行えるフレームワークです。
Webアプリのテストなどに利用されます。

最近(2週間くらいの)Seleniumのことを耳にしたり目にしたりする機会があったので、Seleniumを試しに触ってみました。
Seleniumで何かに取り組む際に一度Seleniumで作ったセッションを破棄せずに使いまわせたら便利な場面があると思うのですが、その方法を把握するのに時間がかかったので備忘録を兼ねて共有します。

今回紹介する方法もドライバのidを書き換えるという強引さを感じる手法なので、アップデートされたら動かなくなるかもしれません。
また、今回紹介する方法以外にセッションを使いまわす方法があれば、コメントなどで教えてもらえると嬉しいです。

使ったものとインストール手順

  • PC
    今回はUbuntu18.04をインストールしたものを利用しました。
    Download Ubuntu Desktop
    SeleniumはUbuntuでなくても動きますが、この記事ではUbuntuで動かす場合の設定方法を紹介します。
  • Firefox
    Ubuntu18.04には標準でFirefoxがインストールされています。
  • Python3 + Selenium
    UbuntuでPythonとSeleniumは下記のコマンドでインストールできます。
    sudo apt install python3-pip
    pip3 install -U selenium
  • Gecko
    SeleniuでFirefoxを動かすためのプログラムです。
    Geckoのリポジトリのリリースページから最新のファイルをダウンロードしてインストールします。
    自分が確認したときはv0.26.0だったので、ダウンロード後に下記のようなコマンドを実行してインストールしました。
    tar -xzvf geckodriver-v0.26.0-linux64.tar.gz
    chmod a+X geckodriver
    sudo mv geckodriver /usr/local/bin/
  • Java + Selenium Server
    セッションを使いまわすためにSeleniumのポートを固定しておく必要が(多分)あるため、Selenium Serverを利用します。
    Selenium Serverはjarファイルとして配布されているため、実行にJavaが必要です。
    記事を書いている時点で利用可能な最新版のJava(openJDK版)はv11だったので、下記のコマンドでインストールしました。
    sudo apt install openjdk-11-jre
    Selenium Serverのjarファイルは、Seleniumのダウンロード可能なソフトウェア一覧ページからダウンロードします。
    JavaがインストールされたUbuntuでダウンロードしたSelenium Serverのjarファイルは下記のようなコマンドで実行できます。
    ファイル名に含まれるバージョンは、ダウンロードしたファイル名に合わせてください。
    java -jar selenium-server-standalone-3.141.59.jar

セッション使いまわす方法

Selenium Serverを起動

インストール手順でも紹介したように、Javaのコマンドを実行してSelenium Serverを起動します。
java -jar selenium-server-standalone-3.141.59.jar

4444番ポートを利用するSelenium Serverが立ち上がります。


使いまわすためのセッションを作成

Selenium Server経由でセッションを作成し、セッションのIDを返却する下記のPythonプログラムを実行します。
下記のプログラムは2048-undoというゲームのページを開いた状態のセッションを作成します。
startSesion.py
from selenium import webdriver

executor_url = 'http://localhost:4444/wd/hub'
browser = webdriver.Remote(command_executor=executor_url, desired_capabilities=webdriver.DesiredCapabilities.FIREFOX)

browser.get('https://www.quaxio.com/2048/')
print(browser.session_id)

このプログラムは実行が成功するとFirefoxを起動した後にセッションIDを表示して終了します。
python3 src/startSession.py


bash環境下で実行する場合は、下記のように実行すると変数にセッションIDを格納できます。
SESSION_ID=`python3 startSession.py`
echo $SESSION_ID

使いまわしたいセッションに接続

使いまわしたいセッションIDを引数として受け付ける下記のPythonプログラムを実行します。
下記プログラムでは、再接続したセッションでキーボードの上矢印と右矢印を入力する動作を実施します。
actionUpRight.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement

executor_url = 'http://localhost:4444/wd/hub'
session_id = sys.argv[1]
capabilities = webdriver.DesiredCapabilities.FIREFOX

browser = webdriver.Remote(command_executor=executor_url, desired_capabilities=capabilities)
browser.close()
browser.session_id = session_id

actions = ActionChains(browser)
actions.send_keys(Keys.ARROW_UP)
actions.send_keys(Keys.ARROW_RIGHT)
actions.perform()

既存のセッションIDを利用してセッションを起動する方法が見つからなかったため、セッションを作った後、そのセッションを閉じ、セッションIDを書き換えることで使いまわしたいセッションに接続しています。
参考:  How to reuse existing Selenium browser session
他の方法があるなら、教えてもらえると嬉しいです。

先程実行したPythonプログラムで取得したセッションIDを渡しつつ、プログラムを実行します。
xxxxxxをセッションIDに置き換えてください
python3 actionUpRight.py xxxxxx


成功すると開いているセッションの駒が移動します。

セッションIDをbashの変数に格納している場合は、下記のコマンドでも実行できます。
python3 actionUpRight.py $SESSION_ID

まとめ

再接続方法が強引な気がするものの、Selenium Serverを通して作成したセッションを使いまわせました。
「作って破棄して入れ替える」という強引さを感じない使いまわし方があれば、コメントなどで教えてもらえると嬉しいです。

0 件のコメント :