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()
出力:
上記の例からわかるように、ページをロードしてから正確に 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()
出力:
上記のコードのタイムアウト値は 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 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