參考:https://blog.csdn.net/u013250071/article/details/79133116
selenium三種等待方式
-
time.sleep(x):強制等待
第一種也是使用最簡單的一種辦法就是強制等待sleep(X),強制讓瀏覽器等待X秒,不管當前操作是否完成,是否可以進行下一步操作,都必須等X秒的時間。
缺點:不能準確把握需要等待的時間(有時操作還未完成,等待就結束了,導致報錯;有時操作已經完成了,但等待時間還沒有到,浪費時間),如果在用例中大量使用,會浪費不必要的等待時間,影響測試用例的執行效率。
優點:使用簡單,可以在調試時使用。
-
implicitly_wait(X):隱式等待
第二種方法是隱形等待,其設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然后執行下一步操作。
缺點:使用隱式等待,程序會一直等待整個頁面加載完成,才會執行下一步操作;
但有時候頁面想要的元素早已經加載完成了,但是因為網頁上個別元素還沒有加載完成,仍要等到頁面全部完成才能執行下一步,使用也不是很靈活。
優點:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
-
WebDriverWait(driver, 超時時間, 調用頻率, 要忽略的異常).until(要執行的方法, 超時時返回的錯誤信息)
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
20:最長等待時間。
0.5:檢查間隔時間,每隔0.5秒檢查一次操作是否完成。
EC.presence_of_element_located(locator):判斷目標元素是否已經成功加載。
presence_of_element_located: 當我們不關心元素是否可見,只關心元素是否存在在頁面中。
visibility_of_element_located: 當我們需要找到元素,并且該元素也可見。
有些頁面的鏈接打開后,會重新打開一個窗口,對于這種情況,想在新頁面上操作,就得先切換窗口了。獲取窗口的唯一標識用句柄表示,所以只需要切換句柄,我們就能在多個頁面上靈活自如的操作了。
-
driver.current_window_handle
獲取當前頁面的句柄
-
window_handles
獲取當前所以的句柄
前言
在用selenium定位頁面元素的時候會遇到定位不到的問題,明明元素就在那兒,用firebug也可以看到,就是定位不到,這種情況很有可能是frame在搞鬼
切換frame(iframe)
frame標簽有frameset、frame、iframe三種,frameset跟其他普通標簽沒有區別,不會影響到正常的定位,而frame與iframe對selenium定位而言是一樣的,selenium有一組方法對frame進行操作
- switch_to.frame()
切換至frame
from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index來定位,第一個是0
# driver.switch_to.frame("frame1") # 2.用id來定位
# driver.switch_to.frame("myframe") # 3.用name來定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement對象來定位
- 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() # 如果當前已是主文檔,則無效果
前言
頁面經常回切換窗口或者alert所以特此記錄一些方法
switch_to包的方法詳解
- driver.switch_to.active_element()
等同于driver.switch_to_active_element()
解釋:定位到當前聚焦的元素上
- driver.switch_to.alert()
等同于 driver.switch_to_alert()
解釋:切換到alert彈窗
- driver.switch_to.default_content()
等同于driver.switch_to_default_content()
解釋:切換到最上層頁面
- driver.switch_to.frame(frame_reference)
等同于 driver.switch_to_frame(frame_reference)
解釋:通過id、name、element(定位的某個元素)、索引來切換到某個frame
- driver.switch_to.parent_frame()
解釋:這是switch_to中獨有的方法,可以切換到上一層的frame,對于層層嵌套的frame很有用
- driver.switch_to.window(window_name)
等同于 driver.switch_to_window(window_name)
解釋:切換到制定的window_name頁面