日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Selenium之顯性等待詳解

本文轉(zhuǎn)載自微信公眾號(hào)「Python技術(shù)」,作者派森醬 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python技術(shù)公眾號(hào)。

創(chuàng)新互聯(lián)建站主營(yíng)武清網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開發(fā),武清h5成都微信小程序搭建,武清網(wǎng)站營(yíng)銷推廣歡迎武清等地區(qū)企業(yè)咨詢

上次介紹了下 Selenium 元素等待的三種方法,以及每種元素等待方法的優(yōu)缺點(diǎn),在使用場(chǎng)景下該如何操作。并寫了一些具體使用的簡(jiǎn)單例子,給大家作為參考。后臺(tái)看到大家對(duì)顯性等待比較感興趣,想詳細(xì)了解下如何使用,今天就來(lái)繼續(xù)跟大家詳細(xì)介紹下。

顯性等待使用

在使用 WebDriverWait 調(diào)用可執(zhí)行方法,除了可定位的元素,還可以使用 selenium 提供的 expected_conditions 模塊中的各種條件,也可以使用 WebElement 的 is_enabled(),is_selected(),is_displayed() 等等方法,還可以使用自己封裝的方法。

這次我們換百度官網(wǎng)測(cè)試,首先我先上一段使用顯性等待的標(biāo)準(zhǔn)使用方式,這里使用的 LINK_TEXT 查找的元素:

 
 
 
  1. # 導(dǎo)入庫(kù) 
  2. from selenium import webdriver 
  3. from selenium.webdriver.support.ui import WebDriverWait 
  4. from selenium.webdriver.support import expected_conditions as ECS 
  5. from selenium.webdriver.common.by import By 
  6. import time 
  7.  
  8. # executable_path 用于指定driver存放路徑 
  9. browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver') 
  10.  
  11. # 打開京東官網(wǎng) 
  12. browser.get('https://www.baidu.com/') 
  13.  
  14. # 定位要查找的元素 
  15. loc = (By.LINK_TEXT, "關(guān)于百度") 
  16.  
  17. try: 
  18.   # 等待5秒,直到發(fā)現(xiàn)元素 
  19.     WebDriverWait(driver, 5).until(ECS.presence_of_element_located(loc)) 
  20. except: 
  21.   # 沒有發(fā)現(xiàn)元素則會(huì)打印提示 
  22.     print("沒有找到對(duì)應(yīng)元素!") 
  23. finally: 
  24.   # 發(fā)現(xiàn)元素則執(zhí)行下面的方法 
  25.     driver.find_element_by_link_text('關(guān)于百度').click() 
  26.  
  27. #退出瀏覽器 
  28. browser.quit() 

顯性等待方式介紹

好了,知道顯性等待怎么用了,接下來(lái)我們來(lái)看下,還有哪些其他常見的使用方式:

  • 先來(lái)個(gè)簡(jiǎn)單的,這里通過頁(yè)面標(biāo)題來(lái)判斷
 
 
 
  1. # 元素等待直到標(biāo)題出現(xiàn) `百度一下,你就知道`  
  2. WebDriverWait(driver,3).until(ECS.title_is('百度一下,你就知道')) 
  3.  
  4. # 元素等待直到標(biāo)題出現(xiàn)包含 `百度` 即可 
  5. WebDriverWait(driver,3).until(ECS.title_contains('百度')) 
  • 通常在網(wǎng)頁(yè)中并不是所有元素都是可見的,也有的是初始化時(shí)不可見,加載完成時(shí)則狀態(tài)又變?yōu)榭梢?,所以在元素等待中以下這些方式是經(jīng)常被用到的。
 
 
 
  1. # 元素等待直到能定位到元素,這里是定位到搜索輸入框 
  2. # 這里定位時(shí)不關(guān)心元素是否可見,只要是加載到DOM中能定位到即可 
  3. WebDriverWait(driver,3).until(ECS.presence_of_element_located((By.ID,'kw'))) 
  4.  
  5. # 元素等待直到能定位到可見的元素,比如這里定位到搜索按鈕 
  6. # 和上面不同,這里等待的元素除加載DOM中,也必須可見 
  7. WebDriverWait(driver,3).until(ECS.visibility_of_element_located((By.ID,'su'))) 
  8.  
  9. # 元素等待直到能定位到可見的元素,比如這里定位到搜索框 
  10. # 這個(gè)方法和上面 `visibility_of_element_located` 使用類似 
  11. WebDriverWait(driver,3).until(ECS.visibility_of((By.ID,value='su'))) 
  12.  
  13. # 元素等待直到通過 `CSS` 定位到至少有一個(gè)元素存在,則結(jié)束等待 
  14. WebDriverWait(driver,3).until(ECS.presence_of_all_elements_located((By.CSS_SELECTOR,'.uinv'))) 
  15.  
  16. # 這和上一個(gè)等待方法類似,主要就是需要元素可見才會(huì)結(jié)束等待 
  17. WebDriverWait(driver,3).until(ECS.visibility_of_any_elements_located((By.CSS_SELECTOR,'.uinv'))) 
  18.  
  19. # 元素等待直到元素被加載,可以定位到并且元素必須為不可見狀態(tài),才會(huì)結(jié)束等待 
  20. WebDriverWait(driver,3).until(ECS.invisibility_of_element_located((By.CSS_SELECTOR,'#nwWrap'))) 
  • 在平時(shí)使用中,也經(jīng)常會(huì)用到等待的元素包含某些內(nèi)容來(lái)判斷,而且這種方式能適用很多場(chǎng)景
 
 
 
  1. # 元素等待直到定位到指定的元素,并且元素的屬性值中包含指定的字符串 
  2. WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element((By.XPATH,"http://*[@id='bottom_layer']/div/p[1]/a"),'關(guān)于百度')) 
  3.  
  4. # 這種實(shí)現(xiàn)跟上面效果差不多 
  5. WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),'百度一下')) 
  • 下面幾種方式主要是針對(duì)下拉框類型的等待,還有可點(diǎn)擊的組件,如超鏈接
 
 
 
  1. # 元素等待直到元素被加載,為可見狀態(tài),并且是可點(diǎn)擊的狀態(tài),才會(huì)結(jié)束等待 
  2. WebDriverWait(driver,3).until(ECS.element_to_be_clickable((By.XPATH,"http://*[@id='bottom_layer']/div/p[1]/a"))).click() 
  3.  
  4. # 元素等待直到元素被加載,可見狀態(tài)并且這個(gè)元素是被選中的狀態(tài) 
  5. # 這種方式我運(yùn)用于下拉選擇框 
  6. WebDriverWait(driver,3).until(ECS.element_to_be_selected((By.XPATH,"http://*[@id='sel']/option[2]"))) 
  7.  
  8. # 元素等待直到元素被加載后,并且元素選中狀態(tài)為預(yù)期的狀態(tài),才會(huì)結(jié)束等待 
  9. WebDriverWait(driver,3).until(ECS.element_selection_state_to_be((By.XPATH,"http://*[@id='sel']/option[1]"),False)) 
  • 以下是比較特殊的幾種方式,在某些情況下用處很大
 
 
 
  1. # 元素等待直到頁(yè)面加載出現(xiàn) `alert`,出現(xiàn)自己切換過去并將提示內(nèi)容返回 
  2. WebDriverWait(driver,3).until(ECS.alert_is_present()) 
  3.  
  4. # 其他都是等待加載元素并操作,這種是等待元素被從Dom中移除時(shí),才會(huì)觸發(fā)結(jié)束等待 
  5. WebDriverWait(driver,3).until(ECS.staleness_of(driver.find_element(By.ID,'su'))) 
  6.  
  7. # 這種是頁(yè)面有多個(gè)Frame時(shí),等待頁(yè)面加載直到 `frame1` 可以切換進(jìn)去,這時(shí)就會(huì)自動(dòng)切換到 `frame1` ,然后結(jié)束等待 
  8. WebDriverWait(driver,3).until(ECS.frame_to_be_available_and_switch_to_it(frame1)) 

除了上面這些,還有很多其他的方式,這里就不再一一列舉了,大家有興趣可以自己去研究一下,然后寫些小例子實(shí)際使用下。

對(duì)了,有小伙伴問如果隱性等待和顯性等待都使用了,那它會(huì)按哪種方式等待呢?在這里說下,它會(huì)按等待時(shí)間較長(zhǎng)的設(shè)置為最終等待時(shí)間。

總結(jié)

好了,今天我們又介紹了下 Selenium 顯性等待元素加載的方式,詳細(xì)介紹并列舉了一些常見場(chǎng)景使用的例子,給大家學(xué)習(xí)參考,后續(xù)還會(huì)為大家介紹更多。


文章名稱:Selenium之顯性等待詳解
地址分享:http://www.dlmjj.cn/article/djisehd.html