日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Selenium最全超时等待问题的处理方案

發布時間:2025/6/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Selenium最全超时等待问题的处理方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Selenium廣泛應用于自動化測試和自動化業務開發,同時在網絡爬蟲中也有較多的應用,使用Selenium有兩個核心的問題:第一個是如何在爬蟲領域不被識別出來,另一個是在自動化領域如何解決超時加載的問題。

今天來總結一下處理Selenium在自動化業務中的超時加載,讓程序不在奔潰,同時能準確的獲取信息。

首先需要區分兩種超時情況,一種是頁面加載出現的超時,一種是獲取頁面元素的超時。

對于頁面加載出現的超時,Selenium提供了兩個設置:

driver.set_page_load_timeout() # 設置頁面加載超時
driver.set_script_timeout() # 設置頁面異步js執行超時

set_page_load_timeout是用于設置頁面加載超時,如下圖在指定時間內未加載出頁面則會報錯。


set_script_timeout,用于execute_async_script()執行的異步js超時報錯。

注意:使用set_page_load_timeout時候,當頁面未加載出任何東西的時候(往往是html源碼未加載),因為超時而停止,會導致driver失效,后面的driver都不能操作,所以超時設置應該至少保證頁面內容加載出來一部分,設置超時不宜過短,如下圖在頁面此種狀態下停止加載后driver失效。

頁面加載超時在打開新頁面、頁面刷新、跳轉等方法執行中會起作用,對于頁面異步加載超時問題可以配合使用js停止,該js語法如下:

window.stop()

該方法類似在瀏覽器上點擊停止載入按鈕,如果頁面在載入圖片或框架(iframe)時間過長,我門可以使用該方法來停止載入。

第二種是獲取頁面元素的超時,又分為隱式等待(implicit) 和 顯示等待(explicit)。

隱式等待(implicit)

隱式等待是設置全局的查找頁面元素的等待時間,在這個時間內沒找到指定元素則拋出異常,只需設置一次,語法如下:

driver.implicitly_wait(time)


顯示等待(explicit)

顯式等待是使用頻率最高的獲取頁面元素超時設置,其原理是通過設置一個最大時間和一個周期時間,按照周期時間來檢測是否出現等待元素,直到達到了最大等待時間。

顯示等待的基本語法如下:

from?selenium.webdriver.support?import?expected_conditions?as?EC
from?selenium.webdriver.support.wait?import?WebDriverWait
from?selenium.webdriver.common.by?import?By
from?selenium?import?webdriver

driver?=?webdriver.Chrome()
WebDriverWait(driver,?3).until(EC.presence_of_element_located((By.ID,?'wrapper')))
WebDriverWait(driver,?3).until_not(EC.presence_of_element_located((By.ID,?'wrapper1')))


其中WebDriverWait用來給指定driver設置超時時間,until、until_not有兩個參數method、message,method是EC即expected_conditions類提供的預先判斷條件message是在超時發生時候的提示信息。

until用來檢測指定元素是否出現,如果在超時時間內出現則返回選擇器信息,否則報出TimeoutException異常。

until_not用于檢測指定元素是否消失,如果在超時時間內消失則返回True,否則會報出TimeoutException異常。

method是EC即expected_conditions類提供的預先判斷條件如下:

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
#?判斷title,返回布爾值

WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
#?判斷title,返回布爾值

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
#?判斷某個元素是否被加到了dom樹里,并不代表該元素一定可見,如果定位到就返回WebElement

WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
#?判斷某個元素是否被添加到了dom里并且可見,可見代表元素可顯示且寬和高都大于0

WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
#?判斷元素是否可見,如果可見就返回這個元素

WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
#?判斷是否至少有1個元素存在于dom樹中,如果定位到就返回列表

WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
#?判斷是否至少有一個元素在頁面中可見,如果定位到就返回列表

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'設置'))
#?判斷指定的元素中是否包含了預期的字符串,返回布爾值

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
#?判斷指定元素的屬性值中是否包含了預期的字符串,返回布爾值

#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
#??判斷該frame是否可以switch進去,如果可以的話,返回True并且switch進去,否則返回False注意這里并沒有一個frame可以切換進去

WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
#?判斷某個元素在是否存在于dom或不可見,如果可見返回False,不可見返回這個元素注意#swfEveryCookieWrap在此頁面中是一個隱藏的元素

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
#?判斷某個元素中是否可見并且是enable的,代表可點擊
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()

WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
#?等待某個元素從dom樹中移除

WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))
#?判斷某個元素是否被選中了,一般用在下拉列表

WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))
#?判斷某個元素的選中狀態是否符合預期

WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
#?判斷某個元素的選中狀態是否符合預期
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

instance?=?WebDriverWait(driver,10).until(EC.alert_is_present())
#?判斷頁面上是否存在alert,如果有就切換到alert并返回alert的內容
instance.accept()
#?關閉彈窗


部分配置來源參考:https://www.cnblogs.com/wxcx/p/8948280.html

注意:顯示等待和隱式等待都存在的,按照其中超時時間設置最大的方式來執行。


總結

以上是生活随笔為你收集整理的Selenium最全超时等待问题的处理方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。