参考: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页面