ホームページ  >  記事  >  バックエンド開発  >  Python Selenium の 3 つの待機メソッドの解釈

Python Selenium の 3 つの待機メソッドの解釈

高洛峰
高洛峰オリジナル
2017-02-22 17:15:211131ブラウズ

待つ方法を知らない人が多すぎることに気づきました。ブロガーは今日、待つことの必要性についてみんなに伝えずにはいられませんでした。

このドロップダウン ボックスが見つからない、ポップアップ ボックスが見つからないなど、グループ内で多くの人が質問しました。実際、ほとんどの場合、次の 2 つの問題があります。 . 枠あり、2. 待ち時間なし。誰もが知っているように、コードの実行速度はどの程度で、ブラウザの読み込みとレンダリングの速度はどのくらいになるでしょうか。これは、Flash と Alto Man がモンスターと戦う約束をし、その後に戦うようなものです。フラッシュは戦いから戻ってきて、なぜあなたはまだ靴を履いて外出しないのですかとアルトマンに尋ねました。 1万匹のアルパカがゲームの中心を飛んでいきました。遅いといじめられて、私は例外を投げてピックを放棄しました。

それでは、AoUman の読み込み速度の遅さにどう対処すればよいでしょうか?方法はただ一つ、待つことです。待機する方法については、ブロガーに 1 つずつ説明してもらいます:

1. 強制待機

1 つ目の最も単純で最も大雑把な方法は、強制的にスリープを待機する (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. 暗黙的待機

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()

非表示の待機は、指定された時間内に Web ページが読み込まれる場合、次のステップが実行されます。それ以外の場合は、その時間まで待機します。有効期限が切れたら、次のステップを実行します。ここには欠点があることに注意してください。つまり、プログラムはページ全体がロードされるまで待機します。つまり、通常、ブラウザのタブ バーの小さな円が回転しなくなったことを確認すると、次のステップが実行されます。しかし、場合によっては、ページ上に必要な要素の読み込みはかなり前に完了していますが、一部の JS やその他の処理が非常に遅いため、次のステップに進む前にページが完全に完了するまで待たなければなりません。必要な要素が表示されるのを待ってから、次のステップを実行する必要があります。方法はあります。それは、Selenium が提供する別の待機メソッドである明示的な待機メソッドに依存します。

暗黙的待機はドライバー サイクル全体で機能するため、設定する必要があるのは一度だけであることに注意してください。暗黙的待機をスリープとして使用している人を見たことがありますが、どこにいてもそれを行うことができます...

3 . 明示的待機

3つ目の方法は明示的待機で、このクラスの until() メソッドと until_not() メソッドを使用することで、判定条件に応じて柔軟に待機することができます。その主な意味は、プログラムは xx 秒ごとに検査を行い、条件が true の場合は次のステップを実行し、それ以外の場合は設定された最大時間を超えるまで待機し、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.. での明示的な待機が役割を果たします。重要な役割を果たしますが、次の点に注意してください。最長待機時間は 2 つの大きい方に依存し、この例では 20 です。暗黙的待機時間 > 明示的待機時間の場合、このセンテンス コードの最長待機時間は待機時間になります。 time は暗黙的な待機時間と同じです。

主に 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, timeout period,callingfrequency,ignoreException) .until(実行可能メソッド、タイムアウト時に返される情報)

ここで特に注意が必要なのは、until または until_not の実行可能メソッドのメソッド パラメータです。

WebDriverWait(driver, 10) のように WebElement オブジェクトを渡します。 until(driver.find_element_by_id('kw' )) # エラー

これは間違った使用法です。ここでのパラメータは呼び出し可能である必要があります。つまり、このオブジェクトには __call__() メソッドが必要です。そうでない場合は例外がスローされます:

TypeError: 'xxx' オブジェクトは呼び出し可能ではありません

ここでは、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

这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入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 個の条件であり、until と until_not を組み合わせて多くの判定を実現できます。これらを単独で柔軟にカプセル化できれば、スクリプトの安定性が大幅に向上します。

今日はこの内容を共有しますので、ご質問がございましたら、メッセージを残してください。このサイトを応援していただきありがとうございます!

Python Selenium の 3 つの待機メソッドの解釈に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。