Python seleniumの3つの待ち方
9875 ワード
強制待機
time.sleep(3)この方法は簡単で乱暴で、XX時間を待たなければなりません.ブラウザがロードされたかどうかにかかわらず、プログラムは3秒待ってから、次のコードを実行し続けなければなりません.あまりにも堅苦しくて、プログラムの実行速度に深刻な影響を与えます.デバッグ用として使用でき、コードにも使用される場合があります.
暗黙的待機
implicitly_wait(xx)は最長待ち時間を設定し、所定時間内にWebページのロードが完了した場合、次のステップを実行します.そうしないと、時間が切れるまで待ってから次のステップを実行します.利点は,強制待機(time.sleep(n))法のように一定時間n秒を死滅させることなく,試験用例の実行効率をある程度向上させることである.しかし、この方法も一つの弊害から、プログラムはページ全体のロードが完了するのをずっと待っているということです.つまり、ブラウザのウィンドウラベルに回転する小さな輪が現れなくなり、次のステップを実行し続けます.例えば、ページ要素がとっくにロードされている場合がありますが、個別のJSリソースのロードが少し遅いため、このとき、プログラムはページのすべてのロードが完了するのを待ってから次のステップを実行し続け、テスト例の実行時間が長くなります.
注意:暗黙的な待機時間は1回だけ設定され、driverのライフサイクル全体で機能します.
私が欲しい要素が出てきたら次はどうすればいいですか?方法は、seleniumが提供するもう一つの待ち方である顕著な待ちwaitにかかっています.
明示的な待機
seleniumを通るwebdriver.support.uiモジュールが提供するWebDriverWaitクラスは、そのクラスのuntil()とuntil_を結合します.not()メソッドは,明示的な待機条件をカスタマイズし,判断条件に基づいて柔軟な待機を行う.明示的な待ちの動作原理:プログラムはxx秒ごとに一目見て、条件が成立したら、次のステップを実行して、さもなくば設定の最長時間を超えるまで待ち続けて、それからTimeoutExceptionを投げ出します.
time.sleep(3)この方法は簡単で乱暴で、XX時間を待たなければなりません.ブラウザがロードされたかどうかにかかわらず、プログラムは3秒待ってから、次のコードを実行し続けなければなりません.あまりにも堅苦しくて、プログラムの実行速度に深刻な影響を与えます.デバッグ用として使用でき、コードにも使用される場合があります.
暗黙的待機
implicitly_wait(xx)は最長待ち時間を設定し、所定時間内にWebページのロードが完了した場合、次のステップを実行します.そうしないと、時間が切れるまで待ってから次のステップを実行します.利点は,強制待機(time.sleep(n))法のように一定時間n秒を死滅させることなく,試験用例の実行効率をある程度向上させることである.しかし、この方法も一つの弊害から、プログラムはページ全体のロードが完了するのをずっと待っているということです.つまり、ブラウザのウィンドウラベルに回転する小さな輪が現れなくなり、次のステップを実行し続けます.例えば、ページ要素がとっくにロードされている場合がありますが、個別のJSリソースのロードが少し遅いため、このとき、プログラムはページのすべてのロードが完了するのを待ってから次のステップを実行し続け、テスト例の実行時間が長くなります.
注意:暗黙的な待機時間は1回だけ設定され、driverのライフサイクル全体で機能します.
# encoding=utf-8
import unittest
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
class VisitSogouByIE(unittest.TestCase):
def setUp(self):
# IE
# self.driver = webdriver.Firefox(executable_path = "d:\\geckodriver")
self.driver = webdriver.Ie(executable_path="d:\\IEDriverServer")
def test_implictWait(self):
#
from selenium.common.exceptions import NoSuchElementException, TimeoutException
#
import traceback
url = "http://www.sogou.com"
# sogou
self.driver.get(url)
# driver implicitly_wait() , 10 , 10
self.driver.implicitly_wait(10)
try:
# sogou
searchBox = self.driver.find_element_by_id("query")
# “ ”
searchBox.send_keys(u" ")
# sogou
click = self.driver.find_element_by_id("stb")
#
click.click()
except (NoSuchElementException, TimeoutException) as e:
#
traceback.print_exc()
def tearDown(self):
# IE
self.driver.quit()
if __name__ == '__main__':
unittest.main()
私が欲しい要素が出てきたら次はどうすればいいですか?方法は、seleniumが提供するもう一つの待ち方である顕著な待ちwaitにかかっています.
明示的な待機
seleniumを通るwebdriver.support.uiモジュールが提供するWebDriverWaitクラスは、そのクラスのuntil()とuntil_を結合します.not()メソッドは,明示的な待機条件をカスタマイズし,判断条件に基づいて柔軟な待機を行う.明示的な待ちの動作原理:プログラムはxx秒ごとに一目見て、条件が成立したら、次のステップを実行して、さもなくば設定の最長時間を超えるまで待ち続けて、それからTimeoutExceptionを投げ出します.
#encoding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Ie(executable_path = "d:\\IEDriverServer")
driver.get("http://www.sogou.com")
input_box=driver.find_element_by_id("query")
wait = WebDriverWait(driver, 10, 0.2)
wait.until(EC.visibility_of(input_box))
input_box.send_keys(u" ")
wait.until(EC.element_to_be_clickable((By.ID ,"stb")))
button=driver.find_element_by_id("stb")
button.click()
time.sleep(3)
driver.close()