UI自動化入門:Web要素の取得と待機方法

1. 要素の取得

  • 要素情報取得方法を学ぶ理由
    主に断言(アサーション)のために関連情報を取得し、自動化テストケースの最終的な実行結果を判断するためです。

  • 要素取得の一般的な方法:

    • size 要素のサイズを取得し、高さと幅の値を含む辞書を返します
      • text 要素のテキスト内容を取得します
      • get_attribute("attribute") 指定された属性名に対応する属性値を取得します。attributeは属性名を指します
      • is_displayed() 要素が表示されているかどうかを判断し、trueまたはfalseを返します
      • is_enabled() 要素が有効かどうかを判断し、trueまたはfalseを返します
      • is_selected() チェックボックスまたはラジオボタンが選択されているかどうかを判断し、trueまたはfalseを返します
  • コード例:

# 必要なモジュールをインポート
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# ブラウザドライバのインスタンス化
browser = webdriver.Chrome()

# Baiduサイトを開く
browser.get("https://www.baidu.com")

# ブラウザウィンドウを最大化
time.sleep(3)
browser.maximize_window()

# Baidu検索ボックスのサイズを取得
box_size = browser.find_element(By.CLASS_NAME, "s_ipt").size
print(box_size)

# リンク「hao123サイト」のテキスト内容を取得
link_text = browser.find_element(By.LINK_TEXT, "hao123").text
print(link_text)

# リンク「hao123サイト」のアドレスを取得
link_address = browser.find_element(By.LINK_TEXT, "hao123").get_attribute("href")
print(link_address)

# 文庫リンクが表示されているかどうかを判断(デフォルトはFalse)
visibility = browser.find_element(By.XPATH, "//*[@class ='s-bri c-font-normal c-color-t'] ").is_displayed()
print("文庫リンクは表示されています:", visibility)

# 「百度一下」ボタンが有効かどうかを判断(デフォルトはFalse)
button_enabled = browser.find_element(By.ID, "su").is_enabled()
print("'百度一下'ボタンは有効です:", button_enabled)

# ページ右上の「ログイン」ボタンをクリックしてログインページに入る
browser.find_element(By.ID, "s-top-loginbtn").click()

# 要素が表示されるまで待つ必要があるため、数秒待機(そうしないとエラーが発生します)
time.sleep(5)

# ページ内の「同意して受け入れる」チェックボックスが選択されているかどうかを判断
checkbox_selected = browser.find_element(By.CSS_SELECTOR, ".pass-checkbox-input").is_selected()
print("ページ内の'同意して受け入れる'チェックボックスは選択されています:", checkbox_selected)

# 3秒待機
time.sleep(3)

# ブラウザウィンドウを閉じる
browser.quit()

2. 要素の待機

要素の待機とは、自動化テストプロセス中に特定の要素が表示されるか、ある条件を満たすまでスクリプトの実行を一時停止する技術です。ページ要素を特定する際に、要素が見つからない場合、指定された時間内に常に待機するプロセスです。以下は一般的に使用される3種類の要素待機タイプです:

  • 暗黙的待機:一定期間内にページが完全に読み込まれたかどうかを確認し、読み込みが完了していれば次の操作に進みます。設定された時間内に読み込みが完了しない場合、タイムアウトエラーが発生します。
  • 明示的待機:指定された時間内に特定の要素が表示されるのを待ちます。要素が指定された時間内に表示された場合、直ちに対応する操作を実行します。待機時間を超えても要素が表示されない場合、タイムアウト例外がスローされます。
  • 強制待機:time.sleep()メソッドを使用して、プログラムを指定された時間だけ一時停止させます。しかし、待機時間が短すぎると要素がまだ読み込まれていない可能性があり、プログラムがエラーを報告します。待機時間が長すぎると、時間が無駄になり、コード全体の実行効率が低下します。

2.1. 暗黙的待機

概念:要素を検索する際に自動的に一定時間待機し、要素が読み込まれたことを確認します。検索プロセス中に要素が見つかった場合、その要素を直接返し、後続の操作を続行します。指定された時間を超えると、NoSuchElementException例外がスローされます。

暗黙的待機の実装方法:

browser.implicitly_wait(timeout) # timeoutは最長待機時間を秒単位で指定します

暗黙的待機の利点は、一度設定するだけで、すべての要素検索メソッドに有効であり、特定の要素の出現を明示的に待機する必要がない点です。ほとんどの場合に適用可能ですが、複雑なウェブページ構造やネットワーク遅延が高い場合には、より正確な待機時間を制御するために明示的待機を使用する必要がある場合があります。

コード例:

# 必要なモジュールをインポート
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# ブラウザドライバのインスタンス化
browser = webdriver.Chrome()

# 暗黙的待機時間を5秒に設定
browser.implicitly_wait(5)

# Baiduサイトを開く
browser.get("https://www.baidu.com")

# 右上の「設定」をクリックし、「検索設定」をクリック
browser.find_element(By.ID, 's-usersetting-top').click()
browser.find_element(By.LINK_TEXT, "搜索设置").click()

# 以下のコード注意:待機時間を0に設定するとエラーが発生します
# 「すべての言語」ラジオボタンが選択されているかどうかを判断
browser.find_element(By.CSS_SELECTOR, "[for = 'SL_0']").is_selected()

# 3秒待機
time.sleep(3)

# ブラウザドライバを終了
browser.quit()

2.2. 明示的待機

概念:明示的待機とは、特定の操作を実行する前に、特定の条件が満たされるのを待つことです。例えば、指定された要素を特定する際に、要素が見つかった場合、その要素を直接返します。見つからない場合、指定された間隔で要素を再検索し、最長待機時間を超えるとタイムアウト例外がスローされます。

その動作原理は以下の通りです:

  1. 待機時間と条件を設定:指定された時間内に、定期的な間隔で条件が成立するかを確認します。
  2. 条件が成立するかを確認:待機時間内に条件が成立した場合、プログラムは続行します。そうでない場合、タイムアウト例外が提示されます。

明示的待機の実装:

WebDriverWait待機クラスをインポート

WebDriverWait(browser, timeout, poll_frequency=0.5).until(lambda x: x.find_element(By.ID, "userA"))

  • browser ブラウザドライバオブジェクトを指します
  • timeout 最長待機時間を指します
  • poll_frequency 検出間隔時間を指し、デフォルトは0.5秒です
  • until untilメソッドに匿名関数を追加して要素を特定します。

コード例:

# 必要なモジュールをインポート
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# ブラウザドライバのインスタンス化
browser = webdriver.Chrome()
browser.maximize_window()

# テストサイトを開く
browser.get("https://www.baidu.com")

# 右上の「設定」をクリック
browser.find_element(By.ID, 's-usersetting-top').click()

# 「検索設定」をクリック
browser.find_element(By.LINK_TEXT, "搜索设置").click()

# 明示的待機を使用して「すべての言語」ラジオボタンが選択されているかどうかを判断
# element = browser.find_element(By.CSS_SELECTOR, "[for = 'SL_0']").is_selected() この行のコードを使用するとエラーが発生します
target_element = WebDriverWait(browser, 5, 0.5).until(lambda x: x.find_element(By.CSS_SELECTOR, "[for = 'SL_0']"))
selection_status = target_element.is_selected()
print("'すべての言語'ラジオボタンは選択されています:", selection_status)

# 3秒待機
time.sleep(3)

# ブラウザドライバを終了
browser.quit()

明示的待機と暗黙的待機の違い:

  1. スローされる例外が異なります暗黙的待機のタイムアウト時はNoSuchElementExceptionがスローされ、明示的待機のタイムアウト時はTimeOutExceptionがスローされます。
  2. 作用範囲が異なります暗黙的待機はすべての要素検索メソッドに有効で、一度定義するだけで済みます。明示的待機は単一の要素にのみ適用されます。
  3. 明示的待機はHTML DOMツリー全体の読み込みを待つ必要がなく、効率がより高いです。一方、暗黙的待機はHTML DOMツリー全体の読み込みが完了するまで待機する必要があります。

2.3. 強制待機

  • 強制待機とは、コードを休眠させ、何も操作しないことです
    time.sleep(time) timeの単位は秒です
  • 一般的な使用シナリオ:

UI自動化において、以下の場合に強制待機が必要になることがあります:

  1. ネットワーク遅延または読み込み遅延:ネットワーク接続が遅い場合やページ読み込み時間が長い場合、要素が完全に表示または使用可能になるまで時間がかかることがあります。このような場合、強制待機はシステムに読み込みを完了するための時間を与えます。
  2. 不安定な環境または外部要因:不安定な環境で自動化テストを実行する場合(例:ネットワーク接続が不安定またはシステムリソースが限られている場合)、強制待機は操作が十分な時間で完了することを確保するための一定の容错性を提供します。
  3. 既知の固定時間遅延(特定の操作には既知の固定時間遅延がある場合)
    • 例えば、フォームを送信後にサーバーの応答を待つ場合。このような場合、強制待機を使用してこの遅延をシミュレートできます。
      • 要素のテキスト内容を取得する必要があるが、そのテキスト内容はバックエンドインターフェースリクエストを通じて取得され、レンダリングされる必要がある場合。この場合、暗黙的待機または明示的待機を使用してもテキスト内容を取得できないため、強制待機を使用する必要があります。
      • 操作する要素は既に存在するが、他の要素が待機しており、その操作要素とビジネス関連がある場合。暗黙的待機または明示的待機を使用してこの要素を操作すると、操作ができないため、強制待機を使用する必要があります。

コード例(このコードはデモンストレーション用であり、実際のシナリオに基づいて判断する必要があります):

# 必要なモジュールをインポート
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# ブラウザドライバのインスタンス化
browser = webdriver.Chrome()
browser.maximize_window()

# テストサイトを開く
browser.get("https://www.baidu.com")

# name属性で入力ボックスを特定し、「ニュース」を入力
time.sleep(2)
search_box = browser.find_element(By.NAME, 'wd')
search_box.send_keys("ニュース")

# 「百度一下」ボタンをクリック:
search_button = browser.find_element(By.ID, 'su')
search_button.click()
time.sleep(3)

# ブラウザを終了し、リソースを解放
browser.quit()

タグ: Selenium UI自動化 要素取得 要素待機 Python

6月5日 19:51 投稿