Selenium 三種等待方式詳解

2022-03-31 17:41:03 字數 4016 閱讀 5651

我們在做web自動化時,一般要等待頁面元素載入完成後,才能執行操作,否則會報找不到元素的錯誤,這樣就要求我們在有些場景下加等待時間。

我們平常用到的有三種等待方式:

利用time模組的sleep方法來實現,最簡單粗暴的等待方法

**:

#

coding = utf-8

from time import

sleep

from selenium import

webdriver

#驅動檔案路徑

driverfile_path = r'

d:\coship\test_framework\drivers\chromedriver.exe'#

啟動瀏覽器

driver = webdriver.chrome(executable_path=driverfile_path)

#driver.get(r'

')#等待3秒

sleep(3)

driver.find_element_by_css_selector(

"#kw

").send_keys("

selenium")

#退出driver.quit()

這種叫強制等待,不管你瀏覽器是否載入完成,都得給我等待3秒,3秒一到,繼續執行下面的**,不建議用這種等待方法,嚴重影響**的執行速度

設定乙個等待時間,如果在這個等待時間內,網頁載入完成,則執行下一步;否則一直等待時間截止,然後再執行下一步。這樣也就會有個弊端,程式會一直等待整個頁面載入完成,直到超時,但有時候我需要的那個元素早就載入完成了,只是頁面上有個別其他元素載入特別慢,我仍要等待頁面全部載入完成才能執行下一步。

**:

#

coding = utf-8

from selenium import

webdriver

#驅動檔案路徑

driverfile_path = r'

d:\coship\test_framework\drivers\chromedriver.exe'#

啟動瀏覽器

driver = webdriver.chrome(executable_path=driverfile_path)

#driver.get(r'

')driver.find_element_by_css_selector(

"#kw

").send_keys("

selenium")

driver.find_element_by_css_selector(

"#su

").click()

#隱式等待30秒

driver.implicitly_wait(30)

result = driver.find_elements_by_css_selector("

h3.t>a")

for i in

result:

print

(i.text)#退出

driver.quit()

上面我們說了隱式等待的乙個弊端,如果我想等我要的元素一載入出來就執行下一步,該怎麼辦?這裡就要用到顯示等待

顯示等待要用到webdriverwait

from selenium.webdriver.support.wait import webdriverwait

配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。它主要的意思就是:程式每隔xx檢查一次,如果條件成立了,則執行下一步,否則繼續等待,直到超過設定的最長時間,然後丟擲timeoutexception

我們先看一下webdriverwait的幫助文件:

>>>help(webdriverwait)

help on

class webdriverwait in

module selenium.webdriver.support.wait:

class

webdriverwait(builtins.object)

|methods defined here:

| | __init__(self, driver, timeout, poll_frequency=0.5, ignored_exceptions=none)

| constructor, takes a webdriver instance and timeout in

seconds.

| |:args:

| - driver - instance of webdriver (ie, firefox, chrome or

remote)

| - timeout -number of seconds before timing out

| - poll_frequency -sleep interval between calls

| by default, it is 0.5second.

| - ignored_exceptions -iterable structure of exception classes ignored

during calls.

|by default, it contains nosuchelementexception only.

| |example:

| from selenium.webdriver.support.ui import

webdriverwait

| | element = webdriverwait(driver, 10).until(lambda

x: x.find_element_by_id("

someid"))

|on)).\

| | until_not(lambda x: x.find_element_by_id("

someid

").is_displ

ayed())

webdriverwait(driver, timeout, poll_frequency=0.5, ignored_exceptions=none)

主要有4個引數:

driver:瀏覽器驅動

timeout:等待時間

poll_frequency:檢測的間隔時間,預設0.5s

ignored_exceptions:超時後的異常資訊,預設丟擲nosuchelementexception

**:

#

coding = utf-8

from selenium import

webdriver

from selenium.webdriver.support.wait import

webdriverwait

#驅動檔案路徑

driverfile_path = r'

d:\coship\test_framework\drivers\chromedriver.exe'#

啟動瀏覽器

driver = webdriver.chrome(executable_path=driverfile_path)

#driver.get(r'

')driver.find_element_by_css_selector(

"#kw

").send_keys("

selenium")

driver.find_element_by_css_selector(

"#su

").click()

#超時時間為30秒,每0.2秒檢查1次,直到class="tt"的元素出現

text = webdriverwait(driver,30,0.2).until(lambda x:x.find_element_by_css_selector("

.tt"

)).text

print

(text)#退出

driver.quit()

selenium三種等待方式

很多時候,我們進行元素定位時無法按預期成功定位到元素,但是我們的 又確保準確無誤,那是什麼原因呢?其實,原因很簡單,大致分為2種 1,所定位的元素在frame iframe中 2,未設定合理的等待 為什麼未設定合理等待的時候,很有可能無法正確定位元素呢?我們知道,的執行速度很快很快,但瀏覽器的渲染速...

selenium 延遲等待的三種方式

1 最直接普通的方式 這個是設定固定的等待時間 thread.sleep 1000 2 顯示等待方式 explicit wait 就是明確的要等待的元素在規定的時間之內都沒找到,那麼就丟擲exception.示例如下 public loginpage loginexpectingfailure 這樣...

selenium的三種等待

1 強制等待 不管頁面是否載入出來,強制讓進城等待。2 隱式等待 driver.implicitly wait 20 3 顯示等待 滿足一些內建的等待條件,這要這些條件滿足,就等待結束。這些條件比如 特定頁面元素載入出來。建立顯示等待的步驟 導包from selenium.webdriver.sup...