Python で Firefox を操作
〜 Selenium を使う 〜
2024-03-14 作成 福島
TOP > tips > python-selenium
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob ]

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 を実行
スタート (右クリック) から「Windows PowerShell(I)」を選択
pip install seleniumselenium 結合モジュールをインストール
pip show seleniumselenium 結合モジュールのインストール状況を表示
 >_ 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> 
1-3. Firefox をインストール
Windows 版の Firefox をインストールする。
詳細はこの稿の 1 ~ 2 を参照のこと。


2. Selenium の動作確認
PowerShell を実行
スタート (右クリック) から「Windows PowerShell(I)」を選択

2-1. Python を起動して selenium 結合モジュールから Firefox を起動する。
 >_ Windows PowerShell 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Users\who> python
Python 3.11.8 (tags/v3.11.8:db85d51, Feb  6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.


>>> from selenium import webdriver # webdriver を準備する >>> driver = webdriver.Firefox() # Firefox を起動してインスタンスを取得する
↓ 下記 2-2 へ
2-2. Firefox で Web ページを表示する。


>>> driver.get('http://www.python.org') # Web ページを開く
↓ 下記 2-3 へ

http を指定したが https にリダイレクトされた。
2-3. Web ページ http://www.python.org/ の検索欄に を入力する。


>>> 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 へ



検索項目を空にしたため、結果は特に期待しない。
2-4. Firefox を閉じる。


>>> driver.close() # Firefox を閉じる >>> ^Z # Windows なので「Ctrl」+「Z」を入力する
PS C:\Users\who>
Firefox のウィンドウが終了した


3. Firefox のアドオンで使いやすくする

3-1. Firefox に Selenium IDE をインストール
Windows 版の Firefox にアドオン Selenium IDE をインストールする。
詳細はこの稿の 3 を参照のこと。
3-2. pytest をインストール
Selenium IDE でエクスポートする Python スクリプトは pytest 用のため、pytest をインストールする。

PowerShell を実行
スタート (右クリック) から「Windows PowerShell(I)」を選択
pip install pytestpytest モジュールをインストール
pip show pytestpytest モジュールのインストール状況を表示
 >_ 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> 
3-3. Selenium IDE を実行してスクリプトファイルを生成
上記 2 を Selenium IDE で操作してみる。

3-3-1. Selenium IDE を起動する。
Firefox の拡張アイコン (パズルのピース) から Selenium IDE を起動する。
3-3-2. プロジェクトを作成する。
3-3-2-1. プロジェクトを選択する。
Selenium IDE が起動するとプロジェクトについての選択肢が表示される。
Record a new test in a new projectプロジェクトを新規作成すると同時に新しい録画を開始する。
Open an existing project既存のプロジェクトを開く。
Create a new projectプロジェクトを新規作成する。
Close Selenium IDESelenium IDE を終了する。

プロジェクトの新規作成 (Create a new project) をクリックする。
3-3-2-2. プロジェクト名を指定する。
作成するプロジェクトの名称を記入して ボタンをクリックする。

ここではプロジェクト名称として「test」を指定している。
この名称は、内部的に使用されるだけで他に参照されることはない。
(プロジェクトファイルを保存するときの標準名としても使用される)
3-3-2-3. 操作 (テストケース) の記録を開始する。
(REC) アイコンをクリックする。
3-3-2-4. 操作する Web ページを指定する。
操作を開始する URL を記入して ボタンをクリックする。

pytest で実行するときは、ここで指定したサイト以外へジャンプしようとするとエラーになるので、操作には注意が必要。
(Selenium IDE の再生ボタン「▷」で実行する場合はエラーにならない)

3-3-2-5. Firefox で Web ページを操作する。
3-3-2-5-1. 上記 3-3-2-4 で指定した Web ページが表示されるので、検索操作を実行する。
検索項目を選択 (マウスでクリック) して ⏎ キーを打鍵する。
(文字列を指定せずに検索を実行する)

(Selenium IDE is recording(Selenium-IDE が記録中です)...) が表示されている。
3-3-2-5-2. 検索結果を確認する。
今回、ここで実施する操作はない。
Web ページの下半分に表示されている検索結果を確認するのみ。
(検索項目を空にしたため、結果は特に期待しない)

(Selenium IDE is recording(Selenium-IDE が記録中です)...) が表示されている。
3-3-2-6. Selenium IDE の記録を止める。
(■) アイコン ((REC) だった場所) をクリックする。
3-3-2-7. 操作 (テストケース) に名前を付与する。
操作に名前をつけて ボタンをクリックする。
ここでは名前を「practice1」としている。
 ⇓
操作 (テストケース) に「practice1」という名前が付与された。
3-3-3. スクリプトをエクスポートする。
3-3-3-1. 作成した操作 (テストケース) からエクスポートを選択する。
命名したテストケースの右にマウスカーソルを当てると
メニューアイコン「︙」が現れるので、これをたどり
「Export」を選択する。
3-3-3-2. エクスポートするソースプログラムの言語種別を選択する。
Python pytest」を選択して ボタンをクリックする。
3-3-3-3. ファイル名を指定する。
ファイルを保存するダイアログボックスが表示されるので、
ファイル名を確認して ボタンをクリックする。

ファイル名は標準で「test_テストケース名.py」になる。
(pytest は text_xxxx.py を実行しようとするので、これに合わせてある)

また、ここでは保存先フォルダー名として「ドキュメント」
(C:\Users\who\Documents\) を選択している。
3-3-4. Selenium IDE を終了する。
3-3-4-1. Selenium IDE のウィンドウ右上の「 × 」をクリックしてウィンドウを閉じる。

3-3-4-2. 終了確認。
ボタンをクリックする。
3-4. スクリプトファイルを実行
3-4-1. 上記 3-3 で生成したスクリプトファイルを確認する。
C:\Users\who\Documents\test_practice1.py
# 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)
*1 pytest では class Test****() をすべて実行する決まりになっている。
*2この行は本来存在しないが、結果を見易くするために追加している。(これがないと実行結果のウィンドウがすぐに閉じてしまう)
3-4-2. Python でスクリプトを実行
PowerShell を実行
スタート (右クリック) から「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 を指定しても良いが、フォルダーの階層が深いのでパスを通す必要がある。
どうしても 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 はインストールの状況により変化する。