当前位置: 首页 > 编程笔记 >

selenium WebDriverWait类等待机制的实现

马清野
2023-03-14
本文向大家介绍selenium WebDriverWait类等待机制的实现,包括了selenium WebDriverWait类等待机制的实现的使用技巧和注意事项,需要的朋友参考一下

在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:

一、固定等待(time)

  固定待是利用python语言自带的time库中的sleep()方法,固定等待几秒。这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用。(注:脚本调试过程时,还是可以使用的,方便快捷)

from selenium import webdriver
import time

#驱动浏览器
driver = webdriver.Chrome()

#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')

#设置固定等待
time.sleep(2)

driver.quit()

二、隐式等待(implicitly_wait())

 webdriver类提供了implicitly_wait()方法来配置超时时间。隐式等待表示在自动化实施过程中,为查找页面元素或者执行命令设置一个最长等待时间。如果在规定时间内页面元素被找到或者命令被执行完成,则执行下一步,否则继续等待直到设置的最长等待时间截止

from selenium import webdriver

#驱动浏览器
driver = webdriver.Chrome()

#设置隐式等待
driver.implicitly_wait(30)

#设置窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com/')

   注:隐式等待的好处是不用像固定等待方法一样死等时间N秒,可以在一定程度上提升测试用例的执行效率。不过这种方法也存在一定的弊端,那就是程序会一直等待整个页面加载完成,也就是说浏览器窗口标签栏中不再出现转动的小圆圈,才会继续执行下一步。

三、显式等待(WebDriverWait)

  显示等待会每个一段时间(该时间一般都很短,默认为0.5秒,也可以自定义),执行自定义的程序判断条件,如果判断条件成立,就执行下一步,否则继续等待,直到超过设定的最长等待时间,然后抛出TimeOutEcpection的异常信息。

alert_is_present():判断页面是否出现alert框

# coding:utf-8
from selenium import webdriver
#导入By类
from selenium.webdriver.common.by import By
#导入显示等待类
from selenium.webdriver.support.ui import WebDriverWait
#导入期望场景类
from selenium.webdriver.support import expected_conditions

driver = webdriver.Chrome()

#alert_is_present():判断页面是否出现alert框
result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present())
print(result.text)

element_located_selection_state_to_be(locator,state):判断一个元素的状态是否是给定的选择状态

第一个传入参数是一个定位器,定位器是一个元组(by,path);第二个传入参数表示期望的元素状态,True表示选中状态,Flase表示未选中

#element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_selection_state_to_be((By.ID,'kw'),True))

element_selection_state_to_be(driverObject,state):判断给定的元素是否被选中

第一个传入参数是一个webdriver对象,第二个参数是期望的元素的状态,True表示选中状态,Flase表示未选中

#element_selection_state_to_be():判断给定的元素是否被选中
result=WebDriverWait(driver,10).until(expected_conditions.element_selection_state_to_be((driver.find_element_by_id('kw')),True))

element_located_to_be_selected(locator):期望某个元素处于被选中状态

参数传入的是一个定位器

#element_located_to_be_selected():期望某个元素处于被选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_located_to_be_selected((By.ID,'kw')))

element_to_be_selected():期望某个元素处于选中状态

传入参数是一个webdriver实例对象

#element_to_be_selected():期望某个元素处于选中状态
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_selected(driver.find_element_by_id('kw')))

element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase

#element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase
result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(driver.find_element_by_id('hh')))

frame_to_be_available_and_switch_to_it(parm):判断frame是否可用

如果可用返回True并切入到该frame,参数parm可以是定位器locator(by,path)组成的元组,或者定位方式:id、name、index(frame在页面上索引号),或者webelement对象。

#frame_to_be_available_and_switch_to_it():判断frame是否可用
#传入ID值‘kk'
result1=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(By.ID,'kw'))
#传入frame的webelement对象
result2=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_id('kw')))
#传入frame在页面中索引号
result3=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(1))

invisibility_of_element_located(locator):希望某个元素不可见或者不存在DOM中

满足条件返回True,否则返回定位到的元素对象

#invisibility_of_element_located():希望某个元素不可见或者不存在DOM中,满足条件返回True,否则返回定位到的元素对象
result8=WebDriverWait(driver,10,0.2).until(EC.invisibility_of_element_located(By.ID,'kw'))

visibility_of_element_located(locator):希望某个元素出现在DOM中并且可见

满足条件返回该元素的页面元素对象

#visibility_of_element_located():希望某个元素出现在DOM中并且可见,满足条件返回该元素的页面元素对象
result9=WebDriverWait(driver,10,0.2).until(EC.visibility_of_element_located(driver.find_element_by_id('kw')))

visibility_of(webelement):希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象

#visibility_of():希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象
result10=WebDriverWait(driver,10,0.2).until(EC.visibility_of(driver.find_element_by_id('kw'))

visibility_of_any_elements_located(locator):希望某个元素出现在DOM中并且可见

如果满足条件返回该元素的页面元素对象

#visibility_of_any_elements_located():希望某个元素出现在DOM中并且可见
result11=WebDriverWait(driver,10,0.2).until(EC.visibility_of(By.TAG_NAME,'input'))

presence_of_all_elements_located(locator):判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的页面元素

#presence_of_all_elements_located():判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的压面元素
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_all_elements_located(By.ID,'kw'))

presence_of_element_located(locator):判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象

#presence_of_element_located():判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象
result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_element_located(By.ID,'kw'))

staleness_of(webelement):判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase

#staleness_of():判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase
result13=WebDriverWait(driver,10,0.2).until(EC.staleness_of(driver.find_element_by_id('kw')))

text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text

#text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text
result15=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element(By.TAG_NAME,"p"))

text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中

#text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中
result16=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element_value((By.ID,'kw'),'随便'))

title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可

#title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase
result17=WebDriverWait(driver,10,0.2).until(EC.title_contains("你就知道"))

title_is():判断页面title内容是与传入的title_text内容完全匹配

#title_is():判断页面title内容是与传入的title_text内容完全匹配,匹配返回True,否则返回Flase
result18=WebDriverWait(driver,10,0.2).until(EC.title_is("百度一下,你就知道"))

到此这篇关于selenium WebDriverWait类等待机制的实现的文章就介绍到这了,更多相关selenium WebDriverWait内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 迄今为止,我们所看到的所有解决方案都是为了在忙碌的等待中提供相互排斥。 然而,忙等待并不是资源的最佳分配,因为它始终在持续检查while循环条件时保持CPU繁忙,尽管进程正在等待临界区变为可用。 所有具有繁忙等待的同步机制也受到优先级反转问题的困扰,即每当存在具有较高优先级的进程必须在关键部分之外等待的进程时总会存在自旋锁的可能性,因为机制意图执行较低优先级 在关键部分进行处理。 然而,这些问题需

  • 问题内容: 与传统的等待通知机制相比,使用Condition接口/实现的优点是什么?在这里,我引用道格·李(Doug Lea)的评论: 条件将对象监视方法(wait,notify和notifyAll)分解为不同的对象,从而通过与任意Lock实现结合使用,从而使每个对象具有多个等待集。如果Lock替换了同步方法和语句的使用,而Condition替换了Object监视器方法的使用。 我看到这是实现等待

  • 本文向大家介绍Java等待唤醒机制原理实例解析,包括了Java等待唤醒机制原理实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java等待唤醒机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入

  • 如何等待期货列表15分钟(如果未完成)而不是每个未来?下面的代码将为每个未来等待15分钟。但这不是我想要的

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我的一个应用程序在负载下运行了一段时间后挂起,有人知道在JStack中是什么导致了这样的输出吗: