參考:https://blog.csdn.net/u013250071/article/details/79133116
selenium三種等待方式
-
time.sleep(x):強(qiáng)制等待
第一種也是使用最簡(jiǎn)單的一種辦法就是強(qiáng)制等待sleep(X),強(qiáng)制讓瀏覽器等待X秒痊远,不管當(dāng)前操作是否完成萄凤,是否可以進(jìn)行下一步操作,都必須等X秒的時(shí)間坎藐。
缺點(diǎn):不能準(zhǔn)確把握需要等待的時(shí)間(有時(shí)操作還未完成遇西,等待就結(jié)束了灭衷,導(dǎo)致報(bào)錯(cuò)次慢;有時(shí)操作已經(jīng)完成了,但等待時(shí)間還沒有到,浪費(fèi)時(shí)間)迫像,如果在用例中大量使用拭抬,會(huì)浪費(fèi)不必要的等待時(shí)間,影響測(cè)試用例的執(zhí)行效率侵蒙。
優(yōu)點(diǎn):使用簡(jiǎn)單造虎,可以在調(diào)試時(shí)使用。
-
implicitly_wait(X):隱式等待
第二種方法是隱形等待纷闺,其設(shè)置了一個(gè)最長(zhǎng)等待時(shí)間算凿,如果在規(guī)定時(shí)間內(nèi)網(wǎng)頁(yè)加載完成,則執(zhí)行下一步犁功,否則一直等到時(shí)間結(jié)束氓轰,然后執(zhí)行下一步操作。
缺點(diǎn):使用隱式等待浸卦,程序會(huì)一直等待整個(gè)頁(yè)面加載完成署鸡,才會(huì)執(zhí)行下一步操作;
但有時(shí)候頁(yè)面想要的元素早已經(jīng)加載完成了限嫌,但是因?yàn)榫W(wǎng)頁(yè)上個(gè)別元素還沒有加載完成靴庆,仍要等到頁(yè)面全部完成才能執(zhí)行下一步,使用也不是很靈活怒医。
優(yōu)點(diǎn):隱性等待對(duì)整個(gè)driver的周期都起作用炉抒,所以只要設(shè)置一次即可。
-
WebDriverWait(driver, 超時(shí)時(shí)間, 調(diào)用頻率, 要忽略的異常).until(要執(zhí)行的方法, 超時(shí)時(shí)返回的錯(cuò)誤信息)
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
20:最長(zhǎng)等待時(shí)間稚叹。
0.5:檢查間隔時(shí)間焰薄,每隔0.5秒檢查一次操作是否完成。
EC.presence_of_element_located(locator):判斷目標(biāo)元素是否已經(jīng)成功加載扒袖。
presence_of_element_located: 當(dāng)我們不關(guān)心元素是否可見塞茅,只關(guān)心元素是否存在在頁(yè)面中。
visibility_of_element_located: 當(dāng)我們需要找到元素季率,并且該元素也可見野瘦。
有些頁(yè)面的鏈接打開后,會(huì)重新打開一個(gè)窗口蚀同,對(duì)于這種情況缅刽,想在新頁(yè)面上操作啊掏,就得先切換窗口了蠢络。獲取窗口的唯一標(biāo)識(shí)用句柄表示,所以只需要切換句柄迟蜜,我們就能在多個(gè)頁(yè)面上靈活自如的操作了刹孔。
-
driver.current_window_handle
獲取當(dāng)前頁(yè)面的句柄
-
window_handles
獲取當(dāng)前所以的句柄
前言
在用selenium定位頁(yè)面元素的時(shí)候會(huì)遇到定位不到的問(wèn)題,明明元素就在那兒,用firebug也可以看到髓霞,就是定位不到卦睹,這種情況很有可能是frame在搞鬼
切換frame(iframe)
frame標(biāo)簽有frameset、frame方库、iframe三種结序,frameset跟其他普通標(biāo)簽沒有區(qū)別,不會(huì)影響到正常的定位纵潦,而frame與iframe對(duì)selenium定位而言是一樣的徐鹤,selenium有一組方法對(duì)frame進(jìn)行操作
- switch_to.frame()
切換至frame
from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index來(lái)定位,第一個(gè)是0
# driver.switch_to.frame("frame1") # 2.用id來(lái)定位
# driver.switch_to.frame("myframe") # 3.用name來(lái)定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement對(duì)象來(lái)定位
- switch_to.default_content()
從frame中切回主文檔
driver.switch_to.default_content()
- switch_to.parent_frame()
嵌套frame的操作
<html>
<iframe id="frame1">
<iframe id="frame2" / >
</iframe>
</html>
driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")
frame切回到父frame
driver.switch_to.parent_frame() # 如果當(dāng)前已是主文檔邀层,則無(wú)效果
前言
頁(yè)面經(jīng)撤稻矗回切換窗口或者alert所以特此記錄一些方法
switch_to包的方法詳解
- driver.switch_to.active_element()
等同于driver.switch_to_active_element()
解釋:定位到當(dāng)前聚焦的元素上
- driver.switch_to.alert()
等同于 driver.switch_to_alert()
解釋:切換到alert彈窗
- driver.switch_to.default_content()
等同于driver.switch_to_default_content()
解釋:切換到最上層頁(yè)面
- driver.switch_to.frame(frame_reference)
等同于 driver.switch_to_frame(frame_reference)
解釋:通過(guò)id、name寥院、element(定位的某個(gè)元素)劲赠、索引來(lái)切換到某個(gè)frame
- driver.switch_to.parent_frame()
解釋:這是switch_to中獨(dú)有的方法,可以切換到上一層的frame秸谢,對(duì)于層層嵌套的frame很有用
- driver.switch_to.window(window_name)
等同于 driver.switch_to_window(window_name)
解釋:切換到制定的window_name頁(yè)面