背景
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 件のコメント :
コメントを投稿