天天看點

python selenium 三種等待方式詳解

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq_34173549/article/details/81591216

言:

  當你覺得你的定位沒有問題,但是卻直接報了元素不可見,那你就可以考慮是不是因為程式運作太快或者頁面加載太慢造成了元素不可見,那就必須要加等待了,等待元素可見再繼續運作程式;

正文:

  1.強制等待(sleep)

  設定等待最簡單的方法就是強制等待,其實就是time.sleep()方法,不管它什麼情況,讓程式暫停運作一定時間,時間過後繼續運作;缺點時不智能,設定的時間太短,元素還沒有加載出來,那照樣會報錯;設定的時間太長,則會浪費時間,不要小瞧每次幾秒的時間,case多了,代碼量大了,很多個幾秒就會影響整體的運作速度了;是以盡量少用這個

  2.隐性等待(implicitly_wait())

  driver.implicitly_wait(),隐性等待設定了一個時間,在一段時間内網頁是否加載完成,如果完成了,就進行下一步;在設定的時間内沒有加載完成,則會報逾時加載;

# -*- coding: utf-8 -*-  
from selenium import webdriver
import time

driver = webdriver.Chrome()  
driver.implicitly_wait(20) # 隐性等待,最長等30秒  
driver.get('https://www.baidu.com')
time.sleep(3)
driver.quit()        

  缺點也是不智能,因為随着ajax技術的廣泛應用,頁面的元素往往都可以時間局部加載,也就是在整個頁面沒有加載完的時候,可能我們需要的元素已經加載完成了,那就麼有必要再等待整個頁面的加載,執行進行下一步,而隐性等待滿足不了這一點;

  另外一點,隐性等待的設定時全局性的,在開頭設定過之後,整個的程式運作過程中都會有效,都會等待頁面加載完成;不需要每次設定一遍;

  3.顯性等待(WebDriverWait)

  WebDriverWait(driver, 20, 0.5).until(expected_conditions.presence_of_element_located(locator)),selenium中的wait子產品的WebDriverWait()方法,配合until或者until_not方法,再輔助以一些判斷條件,就可以構成這樣一個場景:每經過多少秒就檢視一次locator的元素是否可見,如果可見就停止等待,如果不可見就繼續等待直到超過規定的時間後,報逾時異常;當然也可以判斷某元素是否在規定時間内不可見等等的各種場景吧,需要根據你自己實際的場景選擇判斷條件;

# -*- coding: utf-8 -*-  
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  
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')  
WebDriverWait(driver,20,0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))  
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()       
expected_conditions子產品中提供了很多可以提供判斷的條件:      
selenium.webdriver.support.expected_conditions(子產品)  

這兩個條件類驗證title,驗證傳入的參數title是否等于或包含于driver.title  

title_is  

title_contains  

這兩個人條件驗證元素是否出現,傳入的參數都是元組類型的locator,如(By.ID, 'kw')  

顧名思義,一個隻要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行  

presence_of_element_located  

presence_of_all_elements_located  

這三個條件驗證元素是否可見,前兩個傳入參數是元組類型的locator,第三個傳入WebElement  

第一個和第三個其實質是一樣的  

visibility_of_element_located  

invisibility_of_element_located  

visibility_of  

這兩個人條件判斷某段文本是否出現在某元素中,一個判斷元素的text,一個判斷元素的value  

text_to_be_present_in_element  

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  

這個條件判斷元素是否可點選,傳入locator  

element_to_be_clickable  

這四個條件判斷元素是否被選中,第一個條件傳入WebElement對象,第二個傳入locator元組  

第三個傳入WebElement對象以及狀态,相等傳回True,否則傳回False  

第四個傳入locator以及狀态,相等傳回True,否則傳回False  

element_to_be_selected  

element_located_to_be_selected  

element_selection_state_to_be  

element_located_selection_state_to_be  

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

staleness_of