0. Python で Firefox を自動化
Web アプリケーションを開発・運用する環境は Linux サーバが当たり前ですが、エンドユーザが使用するのはスマートフォンや Web ブラウザとなります。
このため、シーケンステストや負荷テストを実際のスマートフォンや Windows でブラウザを自動実行するのが理想です。
これを実現する便利な仕組みに Selenium があり、Python には Selenium 結合モジュールがあります。
この結合モジュールを使用すると Python からブラウザの操作が可能になります。
ここでは、Windows 版の Firefox の操作をアドオン Selenium IDE で Python のプログラムとして出力し、そのプログラムを pytest から実行します。
ブラウザを自動化するのは分業が多くなり、プラットホームは主に Windows になると思いますが、Linux (GNOME) でも操作は同じです。
(Linux で実施する場合は必ず GUI から Shell を開いてコマンドを実行します。CUI/CLI だけで実行するとブラウザのインスタンスを生成できずエラーになります)
1. Selenium の準備
1-1. Python をインストール
Windows 版の Python をインストールする。
詳細はこの稿の 1 ~ 2 を参照のこと。
1-2. Selenium 結合モジュールをインストール
PowerShell を実行1-3. Firefox をインストール
スタート (右クリック) から「Windows PowerShell(I)」を選択
• pip install selenium … selenium 結合モジュールをインストール • pip show selenium … selenium 結合モジュールのインストール状況を表示
>_ Windows PowerShell
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 PS C:\Users\who> pip install selenium PS C:\Users\who> pip show selenium Name: selenium Version: 4.18.1 Summary: Home-page: https://www.selenium.dev Author: Author-email: License: Apache 2.0 Location: C:\Users\who\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kf ra8p0\LocalCache\local-packages\Python311\site-packages Requires: certifi, trio, trio-websocket, typing_extensions, urllib3 Required-by: PS C:\Users\who>
Windows 版の Firefox をインストールする。
詳細はこの稿の 1 ~ 2 を参照のこと。
PowerShell を実行
スタート (右クリック) から「Windows PowerShell(I)」を選択
2-1. Python を起動して selenium 結合モジュールから Firefox を起動する。
2-2. Firefox で Web ページを表示する。
2-3. Web ページ http://www.python.org/ の検索欄に を入力する。
>>> driver.get('http://www.python.org') # Web ページを開く
↓ 下記 2-3 へ⇒
http を指定したが https にリダイレクトされた。
2-4. Firefox を閉じる。
>>> from selenium.webdriver.common.keys import Keys # ブラウザへ送り込む特殊キーを準備する >>> elem = driver.find_element(by='name', value='q') # 要素を取得する (q は入力欄の ID) >>> elem.clear() # 入力欄を空にする >>> elem.send_keys(Keys.RETURN) # 入力欄から「⏎」を入れる
↓ 下記 2-4 へ⇒
⇓
検索項目を空にしたため、結果は特に期待しない。
>>> driver.close() # Firefox を閉じる >>> ^Z # Windows なので「Ctrl」+「Z」を入力する
PS C:\Users\who>⇒
Firefox のウィンドウが終了した
3. Firefox のアドオンで使いやすくする
3-1. Firefox に Selenium IDE をインストール
Windows 版の Firefox にアドオン Selenium IDE をインストールする。3-2. pytest をインストール
詳細はこの稿の 3 を参照のこと。
Selenium IDE でエクスポートする Python スクリプトは pytest 用のため、pytest をインストールする。3-3. Selenium IDE を実行してスクリプトファイルを生成
PowerShell を実行
スタート (右クリック) から「Windows PowerShell(I)」を選択
• pip install pytest … pytest モジュールをインストール • pip show pytest … pytest モジュールのインストール状況を表示
>_ Windows PowerShell
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 PS C:\Users\who> pip install pytest PS C:\Users\who> pip show pytest Name: pytest Version: 8.1.1 Summary: pytest: simple powerful testing with Python Home-page: Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugh er, Florian Bruhin, Others (See AUTHORS) Author-email: License: MIT Location: C:\Users\who\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kf ra8p0\LocalCache\local-packages\Python311\site-packages Requires: colorama, iniconfig, packaging, pluggy Required-by: PS C:\Users\who>
上記 2 を Selenium IDE で操作してみる。3-4. スクリプトファイルを実行
3-3-1. Selenium IDE を起動する。
Firefox の拡張アイコン (パズルのピース) から Selenium IDE を起動する。3-3-2. プロジェクトを作成する。
3-3-2-1. プロジェクトを選択する。3-3-3. スクリプトをエクスポートする。
Selenium IDE が起動するとプロジェクトについての選択肢が表示される。3-3-2-2. プロジェクト名を指定する。
Record a new test in a new project プロジェクトを新規作成すると同時に新しい録画を開始する。 Open an existing project 既存のプロジェクトを開く。 Create a new project プロジェクトを新規作成する。 Close Selenium IDE Selenium IDE を終了する。
プロジェクトの新規作成 (Create a new project) をクリックする。
作成するプロジェクトの名称を記入して ボタンをクリックする。3-3-2-3. 操作 (テストケース) の記録を開始する。
ここではプロジェクト名称として「test」を指定している。
この名称は、内部的に使用されるだけで他に参照されることはない。
(プロジェクトファイルを保存するときの標準名としても使用される)
(REC) アイコンをクリックする。3-3-2-4. 操作する Web ページを指定する。
操作を開始する URL を記入して ボタンをクリックする。3-3-2-5. Firefox で Web ページを操作する。
pytest で実行するときは、ここで指定したサイト以外へジャンプしようとするとエラーになるので、操作には注意が必要。
(Selenium IDE の再生ボタン「▷」で実行する場合はエラーにならない)
3-3-2-5-1. 上記 3-3-2-4 で指定した Web ページが表示されるので、検索操作を実行する。3-3-2-6. Selenium IDE の記録を止める。
検索項目を選択 (マウスでクリック) して ⏎ キーを打鍵する。3-3-2-5-2. 検索結果を確認する。
(文字列を指定せずに検索を実行する)
(Selenium IDE is recording...) が表示されている。
今回、ここで実施する操作はない。
Web ページの下半分に表示されている検索結果を確認するのみ。
(検索項目を空にしたため、結果は特に期待しない)
(Selenium IDE is recording...) が表示されている。
(■) アイコン ((REC) だった場所) をクリックする。3-3-2-7. 操作 (テストケース) に名前を付与する。
操作に名前をつけて ボタンをクリックする。
ここでは名前を「practice1」としている。
⇓
操作 (テストケース) に「practice1」という名前が付与された。
3-3-3-1. 作成した操作 (テストケース) からエクスポートを選択する。3-3-4. Selenium IDE を終了する。
命名したテストケースの右にマウスカーソルを当てると3-3-3-2. エクスポートするソースプログラムの言語種別を選択する。
メニューアイコン「︙」が現れるので、これをたどり
「Export」を選択する。
「 Python pytest」を選択して ボタンをクリックする。3-3-3-3. ファイル名を指定する。
ファイルを保存するダイアログボックスが表示されるので、
ファイル名を確認して ボタンをクリックする。
ファイル名は標準で「test_テストケース名.py」になる。
(pytest は text_xxxx.py を実行しようとするので、これに合わせてある)
また、ここでは保存先フォルダー名として「ドキュメント」
(C:\Users\who\Documents\) を選択している。
3-3-4-1. Selenium IDE のウィンドウ右上の「 × 」をクリックしてウィンドウを閉じる。
3-3-4-2. 終了確認。
ボタンをクリックする。
3-4-1. 上記 3-3 で生成したスクリプトファイルを確認する。
C:\Users\who\Documents\test_practice1.py3-4-2. Python でスクリプトを実行
*1 pytest では class Test****() をすべて実行する決まりになっている。
# Generated by Selenium IDE import pytest import time import json from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities class TestPractice1(): #*1 def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} def teardown_method(self, method): time.sleep(5) #*2 self.driver.quit() def test_practice1(self): self.driver.get("https://www.python.org/") self.driver.set_window_size(943, 589) self.driver.find_element(By.ID, "id-search-field").click() self.driver.find_element(By.ID, "id-search-field").send_keys(Keys.ENTER)
*2この行は本来存在しないが、結果を見易くするために追加している。(これがないと実行結果のウィンドウがすぐに閉じてしまう)
PowerShell を実行実行ファイル pytest.exe を指定しても良いが、フォルダーの階層が深いのでパスを通す必要がある。
スタート (右クリック) から「Windows PowerShell(I)」を選択
python -m pytest test_practice1.py を実行する。
>_ Windows PowerShell
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 PS C:\Users\who> cd Documents #「ドキュメント」フォルダーへ移動 PS C:\Users\who\Documents> python -m pytest test_practice1.py ======================================= test session starts ======================================= platform win32 -- Python 3.11.8, pytest-8.0.0, pluggy-1.4.0 rootdir: C:\Users\who\Documents collected 1 item test_practice1.py . [100%] ======================================= 1 passed in 12.45s ======================================== PS C:\Users\who\Documents>
実行結果は上記 3-3-2-5 と同じになる。
((Selenium IDE is recording...) は表示されない)
どうしても pytest.exe を実行したい向きは、こちらをどうぞ。
C:\Users\who\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\Scripts\pytest.exe test_practice1.py
*3who と _qbz5n2kfra8p0 はインストールの状況により変化する。