python-web自動化-三種等待方式


當有元素定位不到時,比如下拉框,彈出框等各種定位不到時;
一般是兩種問題:1 、有frame ;2、沒有加等待


下面學習三種等待方式:

1.強制等待 sleep(xx)
這種方法簡單粗暴,不管瀏覽器是否加載完,程序都要等待規定的xx時間,時間到了才繼續執行下面的代碼。
不建議總是用這種等待方式,會嚴重影響程序的執行速度。

# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
sleep(3)#強制性等待3s再執行以下代碼
print(driver.current_url)
driver.quit()#退出驅動,關閉所有窗口

  

2.隱性等待 implicitly_wait(xx)
這種方法是設置一個最長的等待時間,如果在規定時間內網頁全部元素加載完成,則執行下一步,否則一直等待時間截止才執行下一步。比強制性等待智能些
!隱性等待對整個driver的周期都起作用,所以只要設置一次即可

# -*- coding:utf-8 -*-
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.implicitly_wait(30)#隱性等待,最長30s
print(driver.current_url)
driver.quit()

  

3.顯性等待 WebDriverWait
WebDriverWait配合該類的until()和until_not()方法,根據條件靈活的等待
程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException。

A. 使用前,先引用相關庫

B. 確定元素的定位表達式

C.  使用expected_conditions對應的方法來生成判斷條件

WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.XPATH,ele_locator)))

 

D.  調用WebDriverWait類設置等待總時長、輪詢周期

# -*- coding:utf-8 -*-
#A. 使用前,先引用相關庫
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.Chrome()#打開Chrome瀏覽器
driver.get('https://www.baidu.com/')#打開百度
driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()#點擊【登錄】;click() 方法,可模擬在按鈕上的一次鼠標單擊。
# B. 確定元素的定位表達式
ele_locator = "TANGRAM__PSP_10__footerULoginBtn"#通過id,確定‘用戶名登錄’元素

# C.  使用expected_conditions對應的方法來生成判斷條件
# EC.方法名(定位方式,定位表達式)
# EC.visibility_of_element_located(By.ID,ele_locator)#元素可見

# D.  調用WebDriverWait類設置等待總時長、輪詢周期
# WebDriverWait(driver, 超時時長, 調用頻率(默認0.5s)).until(可執行方法, 超時時返回的信息)
# 等待10秒鍾,每隔1秒去查看對應的元素是否可見;如果可見,繼續下一步操作;如果不可見,則繼續等待,直到10s結束,如果元素還是不可見,則拋出超時異常
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()#點擊【用戶名登錄】

driver.close()#關閉當前窗口

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM