English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python seleniumの三つの待機方法の詳細(必須)

多くの人がグループで質問しています。このドロップダウンリストが定位できない、その弹出ボックスが定位できないなど、さまざまな定位できない問題があります。実際には、ほとんどのケースで問題は二つの問題です:1 フレームが含まれています2 待機を追加していないと知りませんでした。あなたのコードの実行速度はどの程度のものか、ブラウザの読み込みとレンダリングの速度はどの程度のものか、スーパーマンとウルトラマンが怪獣と戦うために約束して、スーパーマンが戯れに戻ってきたら、ウルトラマンがまだ靴を履いている状態で外出していない理由を尋ねます。ウルトラマンは一瞬で心の中で一万匹の羊を連れて、自分の速度が遅いと怒り、遊びをやめて例外を投げて投げ出します。

どうすれば凹凸曼の遅い読み込み速度を考慮できますか?たった一つの方法があります。それは待機することです。待機について話すと、さらに三つの待機方法があります。以下に説明します:

1. 強制待機

最初のもっともシンプルで強引な方法は強制待機sleep(xx)で、スーパーマンを強制的にxx秒待機させます。凹凸曼がどのくらいの速度で追いつくかに関わらず、または既に早く到着しているかに関わらず、必ずxx秒待機します。

コードを見て:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io
sleep(3) # 強制待機3秒後に次のステップを実行します
print driver.current_url
driver.quit()

これは強制待機と呼ばれ、ブラウザが読み込まれたかどうかにかかわらず、プログラムは待機する必要があります。3秒、3秒が経つと、次のコードを実行し続けます。デバッグには非常に役立ちますが、コード内でこのように待機するのは推奨しません。これは非常に硬く、プログラムの実行速度に大きく影響します。

2. 非表示的な待機

もう一つの方法は非表示的な待機と呼ばれ、implicitly_wait(xx)です。非表示的な待機の意味は:スーパーマンとウルトラマンが約束してお互いがどこに行くかに関わらず、ウルトラマンがxx秒待つことにしており、ウルトラマンがその間に来たら、二人はすぐに怪獣と戦うために出発します。もしウルトラマンが指定された時間内に来なかったら、スーパーマンは一人で行きます。もちろん、ウルトラマンがあなたに例外を投げてあなたを待たせます。

コードを見て:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # 非表示的な待機,最長待機30秒
driver.get('https://huilansame.github.io
print driver.current_url
driver.quit()

非表示的な待機は最長待機時間を設定しており、指定された時間内にウェブページが読み込まれた場合、次のステップを実行します。それでも時間が切れるまで待機し、その後次のステップを実行します。ここには一つの欠点があります。それは、プログラムがウェブページの完全な読み込みを待機することです。つまり、通常、ブラウザのタブバーの小さな円が回転しなくなるまで次のステップを実行しますが、時にはページが欲しい要素がすでに読み込まれているのに、個別のjsなどのものが特に遅いため、ページが完全に読み込まれるまで次のステップを実行することができません。私が欲しい要素が現れたら次のステップに進む方法は何か?方法はあります。これはseleniumが提供する別の待機方法である「明示的な待機wait」に依存します。

需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…

3. 显性等待

第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。

先看个代码实例:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
driver.get('https://huilansame.github.io
locator = (By.LINK_TEXT, 'CSDN')
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
finally:
driver.close()

上記の例では、隠性待機と明示的な待機を設定しました。他の操作では隠性待機が決定性を持ちますが、WebDriverWait..の中では明示的な待機が主役となります。ただし、注意が必要です:最長の待機時間は両者の中で大きい方に依存します。この例では}}20、もし隠性待機時間が明示的な待機時間を超える場合、このコードの最長待機時間は隠性待機時間と同じです。

私たちはWebDriverWaitクラスとexpected_conditionsモジュールを使用します。以下にこの2つのモジュールを詳しく見てみましょう:

WebDriverWait

waitモジュールのWebDriverWaitクラスは明示的な待機クラスです。以下にそのパラメータとメソッドを見てみましょう:

selenium.webdriver.support.wait.WebDriverWait(クラス)
__init__
driver: WebDriverインスタンスを渡します。例えば、上記のdriverです。
timeout: 超時時間、待機する最長時間(隠性待機時間も考慮します)
poll_frequency: untilやuntil_notのメソッドを呼び出す間隔時間です。デフォルトは0です。5秒
ignored_exceptions: 忽略する例外です。untilやuntil_notの呼び出し中にこのタプル内の例外が投げられた場合、コードは中断されず待機し続けます。タプル外の例外が投げられた場合、コードは中断され例外が投げられます。デフォルトではNoSuchElementExceptionのみです。
until
method: 待機中に一定時間ごとにこの引数に渡されたメソッドを呼び出し、Falseでない返値が得られないまで待ちます。
message: 超時するとTimeoutExceptionが投げられます。メッセージを例外に渡します。
until_notはuntilの逆で、untilはある要素が現れたりある条件が成立した場合に続行しますが、until_notはある要素が消えたりある条件が成立しない場合に続行します。引数も同じで詳述は省略します。
method
message

以上の内容を見れば基本的にはわかりやすいですが、呼び出し方法は以下の通りです:

WebDriverWait(driver, 超時時間, 調用頻度, 异常を無視).until(実行可能なメソッド, 超时时に返される情報)

ここで特に注意が必要なのはuntilやuntil_notの実行可能なメソッドmethodの引数です。多くの人々が以下のようにWebElementオブジェクトを引数にしています:

WebDriverWait(driver, 10.until(driver.find_element_by_id('kw')) # エラー

これは誤った使い方です。この引数は呼び出し可能でなければなりません。つまり、このオブジェクトには__call__()メソッドがある必要があります。そうでないと例外が発生します:

TypeError: 'xxx' object is not callable

ここでは、seleniumが提供するexpected_conditionsモジュールのさまざまな条件を使用できます。また、WebElementのis_displayed()、is_enabled()、is_selected()メソッド、または自作のメソッドを使用することもできます。次に、seleniumが提供する条件を見てみましょう:

expected_conditions

expected_conditionsはseleniumのモジュールであり、条件を判断するための一系列の条件を含んでいます:

selenium.webdriver.support.expected_conditions(モジュール)
これらの条件クラスはtitleを確認し、入力されたtitleがdriver.titleに等しいか、含まれているかを確認します
title_is
title_contains
これらの条件は要素が存在するかどうかを確認し、入力される引数はすべてlocatorのタプル形式です。例えば(By.ID, 'kw')
名前からわかるように、一つ目は条件を満たす要素が一つでも読み込まれれば通過します;もう一つはすべての条件を満たす要素が読み込まれなければなりません
presence_of_element_located
presence_of_all_elements_located
これらの条件は要素が可視かどうかを確認します。前二つはlocatorのタプル形式の引数を受け取り、三つ目はWebElementを受け取ります
一つ目と三つ目は実際には同じです
visibility_of_element_located
invisibility_of_element_located
visibility_of
この二人の条件は、あるテキストがある要素に存在するかどうかを判断します。一つは要素のtextを判断し、もう一つは要素のvalueを判断します
text_to_be_present_in_element
text_to_be_present_in_element_value
この条件はframeが切り替え可能かどうかを判断し、locatorタプルを直接入力するか、id、name、index、またはWebElementを直接入力できます
frame_to_be_available_and_switch_to_it
この条件はalertが発生しているかどうかを判断します
alert_is_present
この条件は、要素がクリック可能かどうかを判断します。locatorを渡します。
element_to_be_clickable
これらの4つの条件は、要素が選択されているかどうかを判断します。最初の条件はWebElementオブジェクトを渡し、2番目の条件はlocatorタプルを渡します。
3番目の引数はWebElementオブジェクトと状態を渡し、一致すればTrue、不一致であればFalseを返します。
4番目の引数はlocatorと状態を渡し、一致すればTrue、不一致であればFalseを返します。
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最後の条件は、要素がDOMにまだ存在するかどうかを判断します。WebElementオブジェクトを渡すと、ページがリフレッシュされているかどうかを判断できます。
staleness_of

上記がすべてです17conditionが、until、until_notと組み合わせると多くの判断が可能です。自分で柔軟にパッケージ化できると、スクリプトの安定性が大幅に向上します。

上記は、編集者が皆さんに紹介するPython seleniumの3つの待機方法の詳細です(必須)。皆さんの助けになれば幸いです。何か疑問があれば、コメントを残してください。編集者はすぐに回答します。また、呐喊トレーニングサイトに対する皆さんのサポートに感謝します。

声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。本サイトは所有権を有しておらず、人間による編集は行われていません。著作権侵害が疑われる場合は、メールを送信してください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください)で通報してください。関連する証拠を提供し、一旦確認次第、本サイトは即座に侵害される可能性のあるコンテンツを削除します。

基礎教程
おすすめ