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

Python seleniumの待機時間の設定方法

私たちが以前紹介したSeleniumのWebDriverテスト方法は、ウェブページを基にしています。前の例はシンプルなウェブページを使用して操作していましたが、ウェブページの読み込みプロセスが感じられないかもしれません。しかし、実際のアプリケーションでは、ウェブページの読み込みには一定の時間がかかります。あなたのスクリプトは既に実行されていますが、定位するべき要素がまだ読み込まれていないため、要素が見つかりませんというエラーが発生します。明らかに、読み込み時間を考慮していないスクリプトは成功したスクリプトではありません。今日は、待ち時間を設定する方法について紹介します。

待機の3つの方法

time.sleep(n)

n秒の強制待機。Pythonの標準関数で、timeパッケージに含まれています。使用する前にtimeパッケージをインポートする必要があります。私たちの例ではよく使用されますが、脚本の実行結果を明確に見ることができます。この待機方法は非常に愚かで、ページの読み込みがどのように進んでもn秒を待機する必要があり、非常に賢くありません。

implicitly_wait(n)

最大待機時間がn秒で、n秒以内にページが読み込まれた場合には待機を終了します。WebDriverが提供する待機方法で、非表示的な待機とも呼ばれます。これは強制待機よりも少し賢くですが、ページに非常に大きなビデオなどのファイルが含まれている場合には、必要な要素が最初に読み込まれた場合でも、すべてのファイルが読み込まれるまでに待機しなければならず、欠点があります。

WebDriverWait(n)

最大待機時間がn秒で、n秒以内に必要な要素が存在するかを定期的にチェックし、存在する場合には待機を終了します。これはWebDriverが提供する待機方法で、明示的な待機とも呼ばれます。これは非表示的な待機よりも少し賢く、ページ全体の読み込みを無視し、必要な要素が存在する場合には待機を終了します。

強制待機は前の例でも使用されていますが、WebDriverが提供する2つの待機方法を見てみましょう

非表示待機

実際には、非表示待機は前の説明でも使用されていますが、特に使用方法については触れませんでした。今度は、ワンイーストのホームページを開いてみます。これは多くのコンテンツが読み込まれるポータルサイトで、ネットワークの速度によって異なりますが、目測で約10秒程度で読み込まれるまでに、待機時間を設定します。60秒、それからページを開いてから公開講座のボタンをクリックするまでどれくらいの時間がかかるか計算してみましょう。

# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(60) #非表示待機時間60秒
time_start = time.time() #ページを開いた時の時間を記録
driver.get('https://www.163.com/)
driver.find_element_by_id('js_love_url').click()
time_end = time.time() #ボタンをクリックした後の時間を記録
print('access time is : ', time_end - time_start) #時間差を出力、実際に消費された時間
time.sleep(2) #強制待機2秒程度で、実際に公開講座ページを観察するために、
driver.quit()

スクリプトの実行が終わると見ることができますが、私たちは非表示時間として設定しました60秒ですが5約1秒程度(以下の実行結果を見てください)ページが完全に読み込まれました。公開講座ボタンをクリックできます。以下は私の実行結果の一例で、全体の読み込み時間が表示されています。

>>>access time is : 5.717327117919922

显性等待

显性等待使用时需要导入selenium.webdriver.support.wait.WebDriverWait类,API如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver:不用说,你定义的WebDriver浏览器(Chrome,Firefox等)
  • timeout:最长等待时间,单位为秒
  • poll_frequency:间隔查找元素的时间,默认为0.5秒(不设定就是0.5秒),也就是说默认0.5秒去查看一次要查找的元素是否存在,找到了就结束整个显性等待,否则继续等待0.5秒再查找一次
  • ignored_exceptions=None:超时发送的异常信息,默认发送NoSuchElementException

由于显性等待可能需要确认元素是否存在,一般还要配合以下两个方法使用

until(method, message='')
until_not(method, message='')
  • method:until()的method意为将驱动程序提供的方法作为参数调用,直到返回为not False,until_not()的method就是直到返回为False
  • message:超时传的异常信息

注意,method()必须是可调用的方法,要有__call__()方法。上面的例子,我们重新写一下。

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
driver = webdriver.Chrome()
class button():
 def __call__(self, driver):
  if driver.find_element_by_id('js_love_url'):
   return True
  else:
   return False
driver.implicitly_wait(60)
time_start = time.time()
driver.get('https://www.163.com/)
# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver,2,0.5).until(button()) 
time_end = time.time()
print('access time is : ', time_end - time_start)
time.sleep(2)
driver.quit()

この例を観察した後、疑問を持つかもしれません。私の表示待機は明らかに設定されていますが、2秒、なぜエラーメッセージが出ないのでしょうか。なぜなら、私たちが同時に非表示待機時間も設定しているため、両方の時間の中で最も長い時間が実際の待機時間となります。したがって、この例では待機時間はまだ60秒。

まとめ

1、Seleniumは待機を3種類採用しており、最も賢明なのは表示待機WebDriverWait()です。
2、非表示待機と表示待機が同時に存在する場合、最も長い待機時間が有効な待機時間となります。
3、表示待機のuntil(method())のmethod()は呼び出せるメソッドであり、自分で定義することもできます。また、匿名関数などの方法も使えます。これについては後で詳しく説明します。
4、非表示待機の設定は一度行い、スクリプト全体を通して続けます。強制待機は、必要なすべての場所で設定する必要があります。

これで本文のすべての内容が終わりました。皆様の学習に役立てば幸いです。また、ナイアラチュートリアルを多くのサポートをお願いします。

声明:本文の内容はインターネットからネットワークに基づいており、著作権者はすべての権利を持ちます。内容はインターネットユーザーによって自発的に貢献し、自己でアップロードされました。本サイトは所有権を持ちません。また、人工的な編集処理も行われていません。著作権侵害を疑われる内容が見つかった場合は、notice#wまでメールを送信してください。3codebox.com(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ