Python で Selenium Web Driver Wait を追加する

Rana Hasnain Khan 2024年2月15日
  1. Python Selenium Web ドライバー待機
  2. Selenium Web ドライバーでの暗黙の待機
  3. Selenium Web ドライバーでの明示的な待機
Python で Selenium Web Driver Wait を追加する

この記事では、Python で Selenium Web ドライバーに待機を追加する例を紹介します。

Python Selenium Web ドライバー待機

ほとんどの Web アプリケーションは AJAX 技術を使用しています。 このため、Web ページに存在するさまざまな要素は、完全にアップロードされるまでに異なる時間間隔を要します。これは、Selenium が Web ページに存在するまでテキストを見つけることができないためです。

アップロードされる前に、特定のテキストが一部のアプリケーションの Web ページに存在しないことがわかる場合があります。 これにより、アプリケーションのテスト中にエラーが発生します。

この問題は、待機を含めることで解決できます。 これらの待機により、Web ページ上の要素またはその他の操作を検索する際に柔軟性が得られます。

Selenium Web ドライバーは、2 種類の待機を提供します。 1つ目は暗黙の待機で、2つ目は明示的な待機です。

この 2 種類の待機の詳細については、この記事で説明します。

Selenium Web ドライバーでの暗黙の待機

インターネットや Web サイトからの応答が遅いため、すべての結果を取得するのに数秒待たなければならない場合があります。 この場合、暗黙の待機が最適です。

暗黙的な待機は、Web ドライバーが要素を取得するときにすべての要素を利用できるようにするための要素を見つけながら、特定の時間 DOM をポーリングするように Web ドライバーに指示します。 プロセスのデフォルト設定は 0 です。

暗黙の待機を設定すると、Web ドライバー オブジェクトの存続期間になります。

同じWebドライバーを閉じたり、再起動したり、待機値を変更したりせずに実行している限り、同じ量になります。

以下に示すように、Web サイトにアクセスして 10 秒間待ってから、About Usページのリンクをクリックする例を見てみましょう。

コード例:

# python
from selenium import webdriver

ChromeDriver = webdriver.Chrome()

ChromeDriver.implicitly_wait(10)

ChromeDriver.get("https://www.inventicosolutions.com/")

getElemByLink = ChromeDriver.find_element_by_link_text("About Us")

getElemByLink.click()

出力:

Python での Selenium Web Driver 待機の例

上記の例からわかるように、ページをロードしてから正確に 10 秒待ってから About Us ページに移動します。

Selenium Web ドライバーでの明示的な待機

明示的な待機は、特定の条件が発生するのを待機し、コード内でさらに処理を進めるように定義されたコードのタイプです。 明示的な待機の極端なケースは time.sleep() です。

これにより、待機の条件が正確な期間に設定されます。

いくつかの適切な方法は、明示的なコードを書くのに役立ちます。 明示的な待機は、Web ドライバーの待機クラスを使用して実現され、expected_conditions と組み合わされます。

以下に示すように、暗黙的な待機の代わりに明示的な待機を使用する例を見てみましょう。

コード例:

# python
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ExpectedCond

chromeDriver = webdriver.Chrome()

chromeDriver.get("https://inventicosolutions.com")

getElembyLinkText = WebDriverWait(chromeDriver, 10).until(
    ExpectedCond.presence_of_element_located((By.LINK_TEXT, "About Us"))
)

getElembyLinkText.click()

出力:

Python での Selenium Web Driver の明示的な待機の例

上記のコードのタイムアウト値は 10 秒です。 Web ドライバーは、Timeout Exception をスローする前に 10 秒間待機します。

アプリケーションの Web ページ アドレス (URL) とテキスト要素は、要件に従って指定されたコードに書き込むことができます。

Web ドライバーの待機 (明示的な待機で使用されるツールの 1つ) には、テキストが正常に見つかるまで 500 ミリ秒ごとに Expected Condition をチェックする組み込みの品質があります。

Python での待機の予想条件

これらの条件は、Web ブラウザーの自動化中に最も頻繁に使用され、Web ドライバーで事前定義されています。 これらの条件は次のとおりです。

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

次のライブラリをインポートすることにより、これらの予想される条件をコードに含めることができます。

# python
from selenium.webdriver.support import expected_conditions as ExpectedCond

Python のカスタム待機条件

上記の方法のいずれもユーザーの要件を満たさない場合は、カスタムの待機条件を作成できます。 カスタム条件は、call() メソッドを持つクラスを使用して作成されます。

以下に示すように、カスタム条件を作成し、プログラムを数秒間待機させる例を見てみましょう。

コード例:

# python
class ElementWithClass(object):
    def __init__(self, location, className):
        self.location = location

        self.className = className

    def __call__(self, ChromeDriver):
        findElem = ChromeDriver.find_element(*self.location)

        if self.className in findElem.get_attribute("class"):
            return findElem
        else:
            return False

        wait = WebDriverWait(ChromeDriver, 10)
        findElem = wait.until(element_has_css_class((By.ID, "myId"), "myClass"))

このコードは、要素が見つかった場合はユーザーにtrueを返し、それ以外の場合はfalseを返します。

そのため、いくつかの例を使用して、Python で待機を追加するさまざまな方法について説明しました。 このトピックを楽しんでいただき、そこから何かを学んでいただければ幸いです。

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

関連記事 - Python Selenium