我們在做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:
(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
(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...