Web自动化测试如何设置等待时间?

https://zhuanlan.zhihu.com/p/32259456

time.sleep(3)固定等待3秒

driver.implicitly_wait(10)隐性的等待,对应全局

WebDriverWait( driver, timeout).until(‘有返回值的__call__()方法或函数’)显性的等待,对应到元素

一、time.sleep(seconds) 固定等待

importtimetime.sleep(3)#等待3秒time.sleep(seconds)seconds#参数为整数,单位(秒)。

它是Python的time提供的休眠方法。

常用于短时间的等待,为了自动测试用例的执行效率固定等待的时间需要控制在3秒内。在用例中尽量少用固定等待。

二、智能隐性的等待implicitly_wait(回应超时等待)

driver.implicitly_wait(time_to_wait)#回应超时等待,隐性的,设置后对应的是全局,如查找元素。driver.implicitly_wait(10)# 设置全局隐性等待时间,单位秒

每次driver执行 找不到元素都会等待设置的时间,它的值设置的过长对用例执行效率有很大的影响,必须在执行完成之后还原回来。driver.implicitly_wait() 要慎之又慎的使用。

driver对它的默认值为0,driver.implicitly_wait(0)能还原隐性等待的设置时间。

三、智能显性等待WebDriverWait

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

参数说明:

driver为webdriver驱动timeout最长超时时间,单位(秒)

poll_frequency循环查找元素每次间隔的时间,默认0.5秒

ignored_exceptions超时后需要输出的异常信息

WebDriverWait()下面有两个方法可用until()和until_not()

WebDriverWait(driver,timeout).until(method,message='')

method 函数或者实例__call__()方法返回True时停止,否则超时后抛出异常。

参数说明:

method 在等待时间内调用的方法或者函数,该方法或函数需要有返回值,并且只接收一个参数driver。message 超时时抛出TimeoutException,将message传入异常显示出来

WebDriverWait(driver,timeout).until_not(method,message='')

于上面的until() 相反,until_not 中的method函数或者实例__call__()方法返回False结束,否则抛出异常。

until方法使用的method 的函数或者类__call()__方法详解:

函数我们一般采用匿名函数lambda 。

lambdadriver:driver.find_element(<定位元素>)# 当定位的元素时为True,无元素时为False。

如示例1、2:

WebDriverWait示例1:

WebDriverWait(driver,5).until(lambdadriver:driver.find_element_by_id('query'))

5秒内等待元素(id='query')出现,lambda driver:driver.find_element_by_id('query') 为一个匿名函数,只有一个driver参数,返回的是查找的元素对象。

WebDriverWait示例2:

WebDriverWait(driver,5).until_not(lambdadriver:driver.find_element_by_name('query'))

5秒内等待元素消失,同示例1 until_not 要求无元素返回即元素不存在于该页面。

定义类中的__call()__方法。

classwait_element(object):def__init__(self,locator):self.locator=locatordef__call__(self,driver):returndriver.find_element(self.locator)WebDriverWait(driver,5).until(wait_element((By.ID,'query')))# 等待元素出现WebDriverWait(driver,

5).until_not(wait_element((By.ID,'query')))# 等待元素消失

wait_element类中__init__()方法接收需要定位的元素,__call__()方法中只能有唯一变量driver,并且返回元素对象。

这样做是是不是很麻烦,其实selenium提供的一个库进行操作,expected_conditions库。引入位置

from selenium.webdriver.support import expected_conditions as ec,它囊括了我们需要使用等待的所有情况。

四、expected_conditions 类库

fromselenium.webdriver.supportimportexpected_conditionsasec# 引入包

下面示例都是以搜狗搜索首页为例。

方法中参数说明 locator=(By.ID, 'id') 表示使用By方法定位元素的元组,element表示获取的webElement元素对象。

ec.title_is(‘title’)判断页面标题等于title

ec.title_contains(‘title’)判断页面标题包含title

WebDriverWait(driver,10).until(ec.title_is('搜狗搜索引擎 - 上网从搜狗开始'))# 等待title 于参数相等WebDriverWait(driver,10).until(ec.title_contains('搜狗搜索引擎'))# 等待title 包含 参数的内容ec.presence_of_element_located(locator)#等待locator元素是否出现ec.presence_of_all_elements_located(locator)#等待所有locator元素是否出现

WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.ID,

'query')))

WebDriverWait(driver, 10).until(ec.presence_of_all_elements_located((By.ID, 'query')))

ec.visibility_of_element_located(locator) #等待locator元素可见

ec.invisibility_of_element_located(locator) #等待locator元素隐藏

ec.visibility_of(element) #等待element元素可见

WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.ID, ''stb''))) #

等待元素可见

WebDriverWait(driver, 10).until(ec.invisibility_of_element_located((By.ID, ''stb''))) #

等待元素隐藏

WebDriverWait(driver, 10).until(ec.visibility_of(driver.find_element_by_link_text('高级搜索'))) #等待元素可见

ec.text_to_be_present_in_element(locator,text) #等待locator的元素中包含text文本

ec.text_to_be_present_in_element_value(locator,value) #等待locator元素的value属性为value

WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element((By.ID, 'erwx'), '搜索APP'))  # 等待元素中包含搜索APP文本

WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element_value((By.ID,

'query'),'selenium')) # 等待元素的值为 selenium,一般用于输入框

ec.frame_to_be_available_and_switch_to_it(locator) #等待frame可切入

WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it((By.ID,

'frame')))

WebDriverWait(driver,10).until(ec.frame_to_be_available_and_switch_to_it('frameid'))ec.alert_is_present() # 等待alert弹出窗口出现

WebDriverWait(driver, 10).until(ec.alert_is_present())

ec.element_to_be_clickable(locator)等待locator元素可点击

WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.ID, 'kw')))

等待元素被选中,一般用于复选框,单选框

ec.element_to_be_selected(element)等待element元素是被选中

ec.element_located_to_be_selected(locator)

等待locator元素是被选中ec.element_selection_state_to_be(element,

is_selected)等待element元素的值被选中为is_selected(布尔值)

ec.element_located_selection_state_to_be(locator,is_selected)等待locator元素的值是否被选

中is_selected(布尔值)

fromseleniumimportwebdriverimporttimefromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasec# 引入包fromselenium.webdriver.common.byimportBydriver=webdriver.Chrome()driver.maximize_window()driver.get(r'https://www.baidu.com/')driver.find_element_by_link_text('设置').click()WebDriverWait(driver,3).until(ec.element_to_be_clickable((By.LINK_TEXT,'搜索设置')))# 等待搜索可点击,不可缺少driver.find_element_by_link_text('搜索设置').click()element=driver.find_element_by_id('s1_1')WebDriverWait(driver,2).until(ec.element_to_be_selected(element))# element被选中WebDriverWait(driver,10).until(ec.element_located_to_be_selected((By.ID,'SL_0')))# id=’SL_0’被选中WebDriverWait(driver,10).until(ec.element_selection_state_to_be(element,True))# element 被选中WebDriverWait(driver,10).until(ec.element_located_selection_state_to_be((By.ID,'SL_1'),False))# id=’SL_1’不被选中time.sleep(3)driver.quit()

五、什么时候使用等待

固定等待sleep与隐性等待implicitly_wait尽量少用,它会对测试用例的执行效率有影响。

显性的等待WebDriverWait可以灵活运用,什么时候需要用到?

1、页面加载的时候,确认页面元素是否加载成功可以使用WebDriverWait

2、页面跳转的时候,等待跳转页面的元素出现,需要选一个在跳转前的页面不存在的元素

3、下拉菜单的时候,如上百度搜索设置的下拉菜单,需要加上个时间断的等待元素可点击

4、页面刷新的时候

总之,页面存在改变的时候;页面上本来没的元素,然后再出现的元素

如果这篇文章对您有所帮助,烦请关注并分享出去,实现她的价值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容