自动化测试-3.selenium中的三种等待方式
作者:互联网
等待是ui自动化中常用的方法,当网络不好或者需要的元素加载比较慢的时候就可以通过等待加载页面,常用的等待方式主要是这三种,分别是
休眠:sleep() 一般用于网络不太好的时候,休眠几秒加载页面
隐式等待:driver.implicitly_wait() 用于加载页面的所有元素,只有所有元素加载完成后才算成功
显示等待:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) 判断是否加载设置的元素,只要加载了设置了的元素就算成功
休眠:首先要导入time模块,写法 from time import sleep 或者 import time,休眠写法简单,但是时间不好判断,可能等待过久,白白浪费时间
写法如下:time.sleep()
隐式等待: driver.implicitly_wait() 当用隐式等待的时候,只有等页面的元素全部都加载出来后,才算执行成功,否则超过我们设置的最大等待时间也没加载出来就报错,默认每隔半秒钟查一次
缺点:比如等待页面全部加载完成,才会执行下一步,有些时候我们需要的元素已经出来了,但是它还要等待全部页面加载出来,就特别浪费时间,没办法对页面指定的元素进行等待
写法如下:self.web.implicitly_wait() 单位秒
通过方法的源码可以知道,设置一个最大时间,隐式等待寻找元素
显示等待:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) 使用显示等待前,首先需要导入from selenium.webdriver.support.wait import WebDriverWait导入模块,才能使用显示等待的方法。 等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到抛出异常
#显示等待,括号里面四个参数分别是我们应用的实例化对象,填入a,第二个参数是最大等待时间,第三个参数是刷新频率,第四个参数是报错信息
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) timeout:超时时间 poll_frequency:访问频率,默认0.5秒找一次元素 lambda x: x=我们设置的实例化,他是webdriverwait类,将传入的self.web赋值给了self.web,until方法调用了self.web,所以传入的x=self.web until函数:表示等待直到元素找到。如果超过等待时间元素未找到,则会抛出timeout的异常;如果查找成功,则返回等待的元素。until_not函数:表示等待直到元素不存在。如果元素存在,则会抛出timeout的异常;如果元素超过等待时间仍不存在,则返回True布尔值。 下面调用的until写法一般用于通过检查某个元素是否被加载来检查是否登录成功 WebDriverWait(self.web,10).until(lambda x:x.find_element(By.ID, "su").send_keys()) 一般会报:oSuchElementException / Timeout这两种异常 WebDriverWait 后面可以使用的 until() 或者 until_not() 方法 缺点:应用上比较复杂,一次性的 优点:最大化节约测试时间,精准的对指定元素进行等待
expected_condtions和显示等待组合使用
在实际的场景中,通常在使用显示等待WebDriverWait的时候,我们还使用到EC即expected_condition(预期条件)来组合判断
写法:先导入ec模块:from selenium.webdriver.support import expected_conditions as EC
一共有16中,这里就不一一举例了,
WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道")) '''判断title,返回布尔值''' WebDriverWait(driver,10).until(EC.title_contains(u"百度一下")) '''判断title,返回布尔值''' WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw'))) '''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement''' WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su'))) '''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0''' WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw'))) '''判断元素是否可见,如果可见就返回这个元素''' WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav'))) '''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表''' WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav'))) '''判断是否至少有一个元素在页面中可见,如果定位到就返回列表''' WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置')) '''判断指定的元素中是否包含了预期的字符串,返回布尔值''' WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下')) '''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值''' WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator)) '''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False''' #注意这里并没有一个frame可以切换进去 WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap'))) '''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素''' #注意#swfEveryCookieWrap在此页面中是一个隐藏的元素 WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click() '''判断某个元素中是否可见并且是enable的,代表可点击''' driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click() WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click() #WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su'))) '''等待某个元素从dom树中移除''' #这里没有找到合适的例子 WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"))) '''判断某个元素是否被选中了,一般用在下拉列表''' WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True)) '''判断某个元素的选中状态是否符合预期''' WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True)) '''判断某个元素的选中状态是否符合预期''' driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click() instance = WebDriverWait(driver,10).until(EC.alert_is_present()) '''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
标签:10,selenium,元素,driver,EC,三种,自动化,until,WebDriverWait 来源: https://www.cnblogs.com/wanggang199612/p/16349799.html