Python seleniumの3つの待ち方

9875 ワード

強制待機
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()