天天看點

五.Python+Selenium自動化測試系列:Selenium三種等待方法

1、強制等待:sleep()

引入time.sleep(second),強制等待,機關秒

from time import sleep
from selenium import webdriver
from driverPath import driver_dir

# driver = webdriver.Chrome()
driver = webdriver.Chrome(executable_path=driver_dir.chrome_driver_path) 
driver.get('https://www.baidu.com') 
# 強制等待3秒 
sleep(3) 
driver.quit() 
           

2、顯示等待:WebDriverWait()

        顯示等待:設定一個等待時間和一個條件,在規定時間内,每隔一段時間檢視下條件是否成立,如果成立那麼程式就繼續執行,否則就提示一個逾時異常(TimeoutException)。 通常情況下WebDriverWait類會結合expected_condition類一起使用

expected_condition類:

# 判斷标題是否和預期的一緻
title_is
# 判斷标題中是否包含預期的字元串
title_contains

# 判斷指定元素是否加載出來
presence_of_element_located
# 判斷所有元素是否加載完成
presence_of_all_elements_located

# 判斷某個元素是否可見. 可見代表元素非隐藏,并且元素的寬和高都不等于0,傳入參數是元組類型的locator
visibility_of_element_located
# 判斷元素是否可見,傳入參數是定位後的元素WebElement
visibility_of
# 判斷某個元素是否不可見,或是否不存在于DOM樹
invisibility_of_element_located

# 判斷元素的 text 是否包含預期字元串
text_to_be_present_in_element
# 判斷元素的 value 是否包含預期字元串
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

#判斷元素是否可點選
element_to_be_clickable

# 判斷元素是否被選中,一般用在下拉清單,傳入WebElement對象
element_to_be_selected
# 判斷元素是否被選中
element_located_to_be_selected
# 判斷元素的選中狀态是否和預期一緻,傳入參數:定位後的元素,相等傳回True,否則傳回False
element_selection_state_to_be
# 判斷元素的選中狀态是否和預期一緻,傳入參數:元素的定位,相等傳回True,否則傳回False
element_located_selection_state_to_be

#判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否重新整理了
staleness_of
           

        WebDriverWait(driver, 逾時時長, 調用頻率, 忽略異常).until(可執行方法, 逾時時傳回的資訊) WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

        driver: 浏覽器驅動

        timeout: 逾時時間,等待的最長時間(同時要考慮隐性等待時間)

        poll_frequency: 每次檢測的間隔時間,預設是0.5秒

        ignored_exceptions:逾時後的異常資訊,預設情況下抛出NoSuchElementException異常

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
from driverPath import driver_dir

# driver = webdriver.Chrome()
driver = webdriver.Chrome(executable_path=driver_dir.chrome_driver_path)
driver.get('https://www.baidu.com')
# 設定浏覽器:driver 等待時間:20s , 判斷條件:等待id='kw'的元素加載完成
wait = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'kw')))

input_box = driver.find_element(By.ID, 'kw')
# 在關鍵詞輸入:關鍵詞
input_box.send_keys('關鍵詞')
driver.quit()
           

3、隐式等待:implicitly_wait(second)

        implicitly_wait(xx):設定等待時間為xx秒,等待元素加載完成,如果到了時間元素沒有加載出,就抛出一個NoSuchElementException的錯誤。

注意:隐性等待對整個driver的周期都起作用,是以隻要設定一次即可。

from selenium import webdriver
from driverPath import driver_dir

# driver = webdriver.Chrome()
driver = webdriver.Chrome(executable_path=driver_dir.chrome_driver_path)
driver.implicitly_wait(30) 
# 隐性等待,最長等30秒 
driver.get('https://www.baidu.com') 
print(driver.current_url) 
print(driver.title) 
driver.quit()