Selenium4の頻出メソッドまとめチートシート【Python】

2024年9月29日Selenium

スポンサーリンク

仕事柄、Seleniumをよく使うのですが、Selenium3のまとめ記事は多くても、未だにSelenium4のまとめ記事が見かけられず、「あれ、これってどう書くんだっけ?」というときに一々調べるのが手間になったため、自分用にまとめ記事を作ってみました。

すべてを網羅しているわけではありませんが、これさえ見ておけば基礎知識でほとんど困ることはないと思われます。

目次

ドライバの初期化

Chromeブラウザを起動する

from selenium import webdriver
webdriver.Chrome()

Selenium3まではwebdriver-managerを用いるなど、ブラウザがバージョンアップする度にドライバを用意していましたが、Selenium4では不要となりました。


※引数としてServiceオブジェクトを渡すことが推奨されています。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service('path/to/chromedriver')
driver = webdriver.Chrome(service=service)

ウェブページの操作

指定したURLのページを開く

driver.get(url)

前のページに戻る

driver.back()

次のページに進む

driver.forward()

現在のページを再読み込みする

driver.refresh()

要素の取得

Selenium3からSelenium4へ移行する際に大きく変わった箇所です。

以下のような書き方で、要素を取得します。

# 要素を一つ取得する
driver.find_element(By, value)

# 要素を複数取得する
driver.find_elements(By, value)

find_elementはコード内で最初に見つかった要素1つを返し、find_elementsはコード内で該当する要素すべてをリスト形式で返します。

タグ名で要素を取得する

element = driver.find_element(By.TAG_NAME, "input")

ID属性で要素を取得する

element = driver.find_element(By.ID, "element_id")

Name属性で要素を取得する

element = driver.find_element(By.NAME, "element_name")

XPathで要素を取得する

element = driver.find_element(By.XPATH, "//div[@class='example']")

クラス名で要素を取得する

element = driver.find_element(By.CLASS_NAME, "class_name")

CSSセレクタで要素を取得する

element = driver.find_element(By.CSS_SELECTOR, ".class_name #element_id")

リンクテキストでハイパーリンクを取得する

element = driver.find_element(By.LINK_TEXT, "リンクテキスト")

部分リンクテキストでハイパーリンクを取得する

element = driver.find_element(By.PARTIAL_LINK_TEXT, "部分テキスト")

要素が見つからない場合のエラーハンドリング

要素が見つからない場合、NoSuchElementExceptionが発生します。

from selenium.common.exceptions import NoSuchElementException

try:
    element = driver.find_element(By.ID, "non_existent_id")
except NoSuchElementException:
    print("要素が見つかりませんでした。")

要素の操作

「要素の取得」で取得したelementに対して、以下の操作が可能です。

要素をクリックする

element.click()

要素にテキストを入力する

element.send_keys(keys)

要素のテキストをクリアする

element.clear()

待機処理

暗黙的に待機する

driver.implicitly_wait(10)  # 要素が見つかるまで最大10秒間待機する

指定した条件が満たされるまで待機する

WebDriverWait(driver, timeout).until(condition)

condition部分には様々な関数が用意されています。
Selenium4では"selenium.webdriver.support.wait“である(uiではない)点に注意が必要です。

要素の存在確認

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    # 指定したロケーターで要素がDOMに存在するか確認する
    EC.presence_of_element_located((By.ID, "element_id"))
)

要素の可視性確認

element = WebDriverWait(driver, 10).until(
    # 要素がDOMに存在し、かつ可視状態であるか確認する
    EC.visibility_of_element_located((By.ID, "element_id"))
)

要素のクリック可能性確認

element = WebDriverWait(driver, 10).until(
    # 要素がクリック可能な状態であるか確認する
    EC.element_to_be_clickable((By.ID, "element_id"))
)

テキストの確認

is_text_present = WebDriverWait(driver, 10).until(
    # 要素内に特定のテキストが存在するか確認する
    EC.text_to_be_present_in_element((By.ID, "element_id"), "期待するテキスト")
)

アラートの表示

WebDriverWait(driver, 10).until(
    # アラートの表示を確認する
    EC.alert_is_present()
)

URLの確認

WebDriverWait(driver, 10).until(
    # 現在のURLが指定したURLと一致するか確認する
    EC.url_to_be("https://www.example.com")
)

ステータスの確認

WebDriverWait(driver, 10).until(
    # ページのタイトルが指定したタイトルと一致するか確認する
    EC.title_is("期待するタイトル")
)

カスタム条件の作成

expected_conditionsに含まれていない条件が必要な場合、カスタム条件を作成することも可能です。

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class element_is_enabled:
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        element = driver.find_element(*self.locator)
        return element.is_enabled()

# 使用例
WebDriverWait(driver, 10).until(
    element_is_enabled((By.ID, "element_id"))
)

ウィンドウ・フレームの取得

現在のウィンドウのハンドルを取得する

driver.current_window_handle

すべてのウィンドウハンドルを取得する

driver.window_handles

ウィンドウ・フレームの操作

指定したウィンドウに切り替える

driver.switch_to.window(window_name)

from selenium import webdriver

# WebDriverの初期化
driver = webdriver.Chrome()

# 新しいウィンドウを開く
driver.execute_script("window.open('https://www.example.com', '_blank');")

# 現在のウィンドウハンドルを取得
current_window = driver.current_window_handle

# すべてのウィンドウハンドルを取得
all_windows = driver.window_handles

# 新しいウィンドウに切り替え
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)
        break

# 新しいウィンドウでの操作
print(driver.title)

# 元のウィンドウに戻る
driver.switch_to.window(current_window)

※上記の例では、JavaScriptで強制的に新規ウィンドウを開いていますが、実務的にはリンクを踏むなど別の方法により複数ウィンドウが発生するケースがほとんどです。

新しいウィンドウ(またはタブ)を開く

# 新しいウィンドウを作成して切り替える
driver.switch_to.new_window('window')

# 新しいタブを作成して切り替える
driver.switch_to.new_window('tab')

現在のウィンドウを閉じる

driver.close()

指定したフレームに切り替える

driver.switch_to.frame(frame_reference)

# iframe要素を保存する
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")

# 選択したiframeに遷移する
driver.switch_to.frame(iframe)

# 遷移先のiframeでボタンを押下する
driver.find_element(By.TAG_NAME, 'button').click()

親フレームに戻る

driver.switch_to.default_content()

JavaScriptの実行

JavaScriptコードを実行する

driver.execute_script(script, *args)

driver.execute_script("alert('Hello, World!');")

ポップアップの操作

アラートや確認ダイアログを受け入れる(OKをクリック)

from selenium.webdriver.common.alert import Alert

alert = Alert(driver)
alert.accept()

アラートや確認ダイアログを拒否する(キャンセルをクリック)

from selenium.webdriver.common.alert import Alert

alert = Alert(driver)
alert.dismiss()

プロンプトダイアログにテキストを入力してOKをクリック

from selenium.webdriver.common.alert import Alert

alert = Alert(driver)
alert.send_keys("入力したいテキスト")  # テキストを入力
alert.accept()  # OKボタンをクリック

プロンプトダイアログにテキストを入力してOKをクリック

アラートや確認ダイアログと同様です。

from selenium.webdriver.common.alert import Alert

alert = Alert(driver)
alert.dismiss()  # キャンセルボタンをクリック

スクロール操作

ページを一番下までスクロールする

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

ページを一番上までスクロールする

driver.execute_script("window.scrollTo(0, 0)")

X座標にxピクセル、Y座標にyピクセルスクロールする

driver.execute_script("window.scrollTo(x, y)")  # x, yは任意の変数

スクリーンショット

現在のページのスクリーンショットを保存する

driver.save_screenshot('./image.png')

ブラウザの終了

ブラウザを閉じ、ドライバを終了する

driver.quit()

以上です。

誤りや追記があれば、適宜更新する予定です。

Selenium

Posted by このめ