English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
等待の使い方がよくわからない人がたくさんいることに気づき、今日は特に等待の必要性について説明したいと思います。
多くの人がグループ内で、このドロップダウンリストが定位できない、その弹出ボックスが定位できないなど、様々な定位できないことを尋ねます。しかし、実際にはほとんどの場合、以下の二つの問題が原因です: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. 明示的な待機
第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)) 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が発生し、messageを例外に传入します。 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(モジュール) これら2つの条件クラスはtitleを確認し、入力されるtitleがdriver.titleに等しいか含まれているかを確認します title_is title_contains これら2つの条件は要素が現れるかどうかを確認します。入力される引数はすべてlocatorのタプルの形式で、例えば(By.ID, 'kw') 名前からも分かるように、1つ目は条件に合った要素が1つでも読み込まれたら通過します;もう1つはすべての条件に合った要素が読み込まれる必要があります presence_of_element_located presence_of_all_elements_located これら3つの条件は要素が可視かどうかを確認します。最初と2番目はlocatorのタプルの形式の引数を入力し、3番目はWebElementを入力します 最初と3番目は実質的に同じです visibility_of_element_located invisibility_of_element_located visibility_of これら2つの条件は、あるテキストがある要素に含まれているかどうかを判断します。1つは要素のtextを判断し、もう1つは要素の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つの条件は、要素が選択されているかどうかを判断します。第1引数には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
上記がすべてです17個のconditionは、until、until_notと組み合わせることで多くの判断が可能です。自分で柔軟に包装することで、スクリプトの安定性が大幅に向上します。
今日はこれだけの内容を共有しました。何か質問があれば、コメントでお知らせください。必要な方々に役立てたら幸いです。皆様の本サイトへのサポートに感謝します!
声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされた内容であり、本サイトは所有権を持ちません。また、人工的な編集は行われておらず、関連する法的責任も負いません。著作権に抵触する内容が見つかった場合は、メールまでご連絡ください:notice#oldtoolbag.com(メールを送信する際、#を@に変更してください)で通報し、関連する証拠を提供してください。一旦確認ができ次第、本サイトは侵害された内容をすぐに削除します。