Python+Selenium-8:元素等待(強制等待、顯式等待和隱式等待)

一、基本概念

1、隱式等待(implicitly_wait)

等待一個元素被發現,或一個命令完成,超出了設置時間則拋出異常,此爲全局變量,是針對Driver 每次執行命令的 最長執行時間也可以理解爲超時時間。

2、顯式等待(WebDriverWait)

明確的要等到某個元素的出現或者是某個元素的可點擊等條件,每隔poll_frequency=0.5(默認值)查找一下元素,等不到,就一直等,除非在規定的時間timeout之內都沒找到,那麼就跳出Exception。

3、強制等待(time.sleep(x))

指定等待時間,不管元素是否存在。使用time模塊提供的sleep方法,腳本在等待sleep(x) x秒後才執行。

二、代碼示例

import time
import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class WaitTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.driver.maximize_window()

        cls.driver.get("https://www.baidu.com")

    def test_sleep_wait(self):

        time.sleep(3)  #強制等待3秒

        self.driver.find_element_by_id('kw').send_keys("軟件測試")
        self.driver.find_element_by_id('su').click()

        self.assertEqual(self.driver.title, "軟件測試_百度搜索")

    def test_webdriver_wait(self):

        self.search_field = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'kw')))
        self.search_field.send_keys("軟件測試")

        self.assertTrue(self.search_field.is_enabled())

    def test_implicitly_wait(self):
        self.driver.implicitly_wait(10)  #隱式等待,最多等10秒

        self.driver.find_element_by_id('kw').send_keys("軟件測試")
        self.driver.find_element_by_id('su').click()

        self.assertEqual(self.driver.title, "軟件測試_百度搜索")
        
    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

if __name__ == "__main__":
    unittest.main(verbosity=2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章