A Selenium(pytest) - user000422/0 GitHub Wiki

導入

公式ドキュメント https://www.selenium.dev/ja/documentation 一般的にはアプリケーションサーバで完結させる。(クライアントのブラウザでキャプチャではない)

★★★ Selenium4.6からChromedriverの準備が不要になった! ★★★ https://qiita.com/Chronos/items/7f56898af25523d04598

■Selenium IDE … 「Google Chrome」Seleniumブラウザ拡張機能

■Seleniumバージョン別動作環境 Pythonがメジャー

ver Java Python
Selenium3 Java8
Selenium4 Java11 Python3

■すべてクライアント(ローカル Windowsマシン)で完結させる手順(実績があるのはこちら) (Python3.11 ※2023/06)

# Selenium インストール
pip install selenium

# Selenium バージョン確認
pip show selenium

# Pytest インストール
pip install pytest

# webdriver-manager インストール
pip install webdriver-manager
# pip アップデート
python -m pip install --upgrade pip

■すべてアプリケーションサーバで完結させる手順

# GoogleChrome
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

# ChromeDriver
# インストールしたGoogleChromeのバージョンと同じバージョンのChromeDriverをダウンロード
# バージョンの最初だけ一致させること(例:114
# URL https://chromedriver.chromium.org/downloads
cd /usr/local/src
wget https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/local/bin/

# Python3(インストールされていない場合)
yum install python3

# Selenium Server
pip3 install selenium

# 日本語フォント
yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts

# composer
cd /usr/local/bin
curl -sS https://getcomposer.org/installer | php
# 拡張子を削除
mv /usr/local/bin/composer.phar /usr/local/bin/composer

開発

ファイル名はなんでもよい。 クラス名は「Test_」から始めなければ起動しない。 メソッド名は「test_」から始めなければ起動しない。

# from は 公式に準拠した記述
from selenium import webdriver
from selenium.webdriver.common.by import By

class Test_Sample():
    def test_01(self):

■setup_method 事前処理。

# 基本型
def setup_method(self, method):
    self.driver = webdriver.Chrome()

# 色々面倒な環境の時
def setup_method(self, method):
    self.service = Service(executable_path=r"C:\WebDriver\bin\chromedriver.exe")

    self.options = Options()
    # 証明書のエラー回避(SSL化していないWebの場合)
    self.options.add_argument('--ignore-certificate-errors')
    self.driver = webdriver.Chrome(service=self.service, options=self.options)
    self.vars = {}

■teardown_method 事後処理。

# 基本型
def teardown_method(self, method):
    self.driver.quit()

find_elements_by_*系は「Selenium4.3」で廃止された sample.py(テストスクリプト)

# ヘッドレスでの実行が必要になるため、ヘッドレスで必要なオプションを追加します。
options = webdriver.ChromeOptions()
options.add_argument('--headless') # ヘッドレスモード(画面描画を行わない)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

# ChromeのWebDriverを作成
driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=options)

# ブラウザを起動(指定URL)
driver.get('https://google.com')

# スクリーンショット
# 引数:フルパス
driver.save_screenshot('sample.png')

# ブラウザを閉じる
driver.quit()

■基本操作(Selenium4)

# Selectを使用する際は必要
from selenium.webdriver.support.select import Select

# 待機 第一引数:秒
time.sleep(1)

# driver

# 表示するブラウザの画面サイズ(横, 縦)
self.driver.set_window_size(1366, 768)

# 要素の取得
sample_elment = self.driver.find_element(By.ID, "sample_id") # idから
sample_elment = self.driver.find_element(By.CLASS_NAME, "sample_class") # class名から
sample_elments = self.driver.find_elements(By.NAME, "sample_radio_btn") # name名から(ラジオボタン 配列)

# 要素の取得(XPATH)色んな要素の組み合わせから(idなどで特定できない場合の最終手段にしたい)
# 裏技: ブラウザデベロッパツールで要素をクリックしコピーのメニューで「XPATHでコピー」がある。
sample_elment = driver.find_element(By.XPATH, '//input[@type="submit" and @value="検索"]')

# クリック
sample_elment.click()
sample_elments[0].click() # 配列(ラジオボタンなど)

# テキスト入力(要素の取得と同時に行う)(一般的)
driver.find_element(By.ID, "sample_textbox").send_keys("hello")

# テキストを削除
driver.find_element(By.ID, "sample_textbox").clear()

# セレクトボックス 特殊
sample_select_element = driver.find_element(By.NAME, "sample_select")
sample_select = Select(sample_select_element) # セレクトボックス用オブジェクトに変換
sample_select.select_by_index(0) # セレクトボックス指定(インデックス)

# 特定の要素の位置にスクロール
self.driver.execute_script("arguments[0].scrollIntoView();", sample_elment)

# 新しく開いたタブに切り替える(インデックス)
self.driver.switch_to.window(driver.window_handles[1])
# スマートフォン
  def setup_method(self, method):
    self.service = Service(executable_path=r"C:\WebDriver\bin\chromedriver.exe")
    self.options = Options()
    mobile_emulation = { "deviceName": "Galaxy S5" } # 端末指定
    self.options.add_experimental_option("mobileEmulation", mobile_emulation) # スマートフォン設定
    self.driver = webdriver.Chrome(service=self.service, options=self.options)
    self.vars = {}

Selenium IDE

エクスポートしたpythonファイルを実行する想定 起動コマンド(コマンドプロンプト) pytest C:\sample\export_test.py 起動コマンド(コマンドプロンプト) pytest -s C:\sample\export_test.py ※print関数で出力したい場合「s」オプション

# エクスポート後に追記したもの
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# setup_methodの改造
  def setup_method(self, method):
    self.service = Service(executable_path='C:\WebDriver\bin\chromedriver.exe')
    self.options = Options()
    self.options.add_argument('--ignore-certificate-errors') ## ssl証明書が有効ではないサイト用(通常は必要ない)
    self.driver = webdriver.Chrome(service=self.service, options=self.options)
    self.vars = {}