当前位置: 首页 > news >正文

Selenium自动化测试的显示等待

在进行UI自动化测试的时候,我们为了保持用例的稳定性,往往要设置显示等待,显示等待就是说明确的要等到某个元素的出现或者元素的某些条件出现,比如可点击、可见等条件,如果在规定的时间之内都没有找到,那么就会抛出Exception.

上面是我用selenium写的一个测试用例,展示了selenium中显示等待的使用方式,其中会使用到expected_conditions模块和WebDriverWait类,注意这里expected_conditions是一个py文件的文件名,也就是一个模块名,这个模块下面有很多的条件类,而我们用例中使用的title_is就是一个条件类。

WebDriverWait是一个类,这个类的作用就是根据一定的条件,不断的检查这个条件是否被满足了。WebDriverWait类只有两个方法,一个是until直到满足某个条件,另一个是until_not直到不满足某个条件。

class WebDriverWait(object): def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):

WebDriverWait有四个参数分别是,driver驱动, timeout超时时间, poll_frequency=POLL_FREQUENCY轮训时间,也就是去判断条件是否满足的时间间隔,默认是0.5秒, ignored_exceptions=None在等待的过程中需要忽略的异常,是一个可迭代的异常类集合,比如我们可以设置一个list,里面是[NoSuchElementException,NoSuchAttributeException,InvalidElementStateException....],默认情况下,是一个元组,只包含一个NoSuchElementException,因为只有元素出现,才能去判断条件是否满足,在不断轮训的过程中,肯定会发生NoSuchElementException,这个时候必须忽略掉这个异常,不然程序就会中断。

其中driver和timeout是毕传的位置参数,另外两个是选择传递的关键字参数,如果不传都有指定的默认值。

下面就进入我们今天的主题,selenium中的等待条件的讨论

等待条件

条件类的实现原理

在selenium.webdriver.support.expected_conditions这个模块里,存放着所有的等待条件,每个条件类的结构都是一样的一个__init__构造方法和一个__call__方法。

在python中,如果想把类型的对象当做函数来使用,那么就可以给这个类实现__call__方法,如下:

class TestCase: def __init__(self): self.driver = webdriver.Chrome(executable_path="./driver/chromedriver") self.driver.get('http://www.baidu.com') # sleep(2) def __call__(self): print(self.driver.title) if __name__ == '__main__': case = TestCase() case()

case()对象的调用,就会执行__call__方法里面的逻辑打印当前页面的标题,我们取一个selenium的实现类:

class presence_of_element_located(object): def __init__(self, locator): self.locator = locator def __call__(self, driver): return _find_element(driver, self.locator)

这个条件类的意思是判断一个元素是否已经渲染到页面当中,在使用这个条件的时候需要先实例化,传入元素的定位,然后要进行判断的时候需要对实例对象进行调用并传入driver,对实例对象进行调用的时候就会执行__call__方法里的条件判断逻辑。

WebDriverWait是如何进行条件判断的

再回到文章开头看一下我们使用显示等待的代码:

wait = WebDriverWait(self.driver, 2) wait.until(EC.title_is('百度一下,你就知道'))

先是实例化一个WebDriverWait对象,然后再调用until方法并且传递一个条件的实例对象,until方法里就会不断的去轮训条件是否满足。

def until(self, method, message=''): screen = None stacktrace = None end_time = time.time() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.time() > end_time: break raise TimeoutException(message, screen, stacktrace)

method这个参数就是我们传递进来的条件的实例对象,value = method(self._driver)这里就是进行对象的调用,也就是执行了__call__方法里的逻辑。

selenium里都有哪些条件
  • title_is 判断title是否出现
  • title_contains 判断title页面标题是否包含某些字符
  • presence_of_element_located 判断某个元素是否被加载到了dom树里,但是并不代表这个元素可见
  • url_contains 判断当前url是否包含某个url
  • url_matches 判断当前url是否符合某种格式
  • url_to_be 判断当前url是否出现
  • url_changes 判断当前url是否已经发生了变化
  • visibility_of_element_located 判断某个元素是否被添加到了dom树里,且宽高都大于0
  • visibility_of 判断看某个元素是否可见
  • presence_of_all_elements_located 判断至少有一个元素存在于dom树中,返回所有定位到的元素
  • visibility_of_any_elements_located 判断至少有一个元素在页面中可见
  • visibility_of_all_elements_located 判断是否所有元素都在页面中可见
  • text_to_be_present_in_element 判断指定的元素中是否包含了预期的字符串
  • text_to_be_present_in_element_value 判断指定的元素属性值中是否包含了预期的字符串
  • frame_to_be_available_and_switch_to_it 判断iframe是否可以switch进去
  • invisibility_of_element_located 判断某个元素是否在dom中不可见
  • element_to_be_clickable 判断某个元素是否可见并且是enable的,也就是说是是否可以点击
  • staleness_of 等待某个元素从dom中删除
  • element_to_be_selected 判断某个元素是否被选中了,一般用于下拉列表中
  • element_located_to_be_selected 与上面的意思一样,只不过上面实例化的时候传入的是元素对象,这个传入的是定位
  • element_selection_state_to_be 判断某个元素的选中状态是否符合预期
  • element_located_selection_state_to_be 与上面一样,只不过传值不同而已
  • number_of_windows_to_be 判断当前窗口数是否等于预期
  • new_window_is_opened 判断是否有窗口增加
  • alert_is_present 判断页面是否有弹窗

以上就是selenium支持的所有条件。

然后就是自定义了

说了那么多条件,其实我们也可以自己实现一个条件类,

class page_is_load: def __init__(self, expected_title, expected_url): self.expected_title = expected_title self.expected_url = expected_url def __call__(self, driver): is_title_correct = driver.title == self.expected_title is_url_correct = driver.current_url == self.expected_url return is_title_correct and is_url_correct

上面是自己实现的一个条件类,根据页面的url和标题来判断页面是否被正确加载,

class TestCase: def __init__(self): self.driver = webdriver.Chrome(executable_path="./driver/chromedriver") self.driver.get('http://www.baidu.com/') # sleep(2) def __call__(self): print(self.driver.title) def test_wait(self): wait = WebDriverWait(self.driver, 2) wait.until(page_is_load("百度一下,你就知道", "http://www.baidu.com/"))

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

http://www.jsqmd.com/news/200567/

相关文章:

  • HTML怎么设置下划线
  • 高级文本数据标注技术指南:方法与工具详解
  • GLM-4.6V-Flash-WEB模型能否理解讽刺类图片内容?
  • 如何在CentOS7上搭建并优化高并发Elasticsearch集群,提升电商平台的实时搜索响应速度?
  • 如何在 Red Hat Linux 8 服务器上使用 Consul 和 Vault 实现分布式配置管理与安全存储
  • AI大模型必学指南:从马斯克预测到高薪就业,这篇收藏价值极高的转型攻略
  • GLM-4.6V-Flash-WEB模型在简历图像解析中的应用场景
  • GLM-4.6V-Flash-WEB模型在滑雪场安全监控中的创新用法
  • 低成本部署GLM-4.6V-Flash-WEB:消费级显卡也能跑通
  • 网易数帆EasyData使用Cloudera CDP、CMP(华为鲲鹏版)作为底座的ChatBI方案
  • 华为OD面试手撕真题 - 移除无效括号
  • GLM-4.6V-Flash-WEB模型能否理解双关语图像表达?
  • 从Java全栈开发到实战:一次真实的面试对话
  • GLM-4.6V-Flash-WEB模型能否解析PDF中的图文混合内容?
  • 交互型机器人深度解析与行业设备分类综述 - 智造出海
  • GLM-4.6V-Flash-WEB模型能否识别古建筑结构特征?
  • 对比主流视觉大模型:GLM-4.6V-Flash-WEB为何更适合Web服务?
  • 如何在CentOS 7.9 上部署并优化高性能 Redis 集群,支持跨数据中心的低延迟访问?
  • 警惕!还在用传统统计模型?随机森林 + 不确定性量化,轻松拿捏环境类核心期刊
  • GLM-4.6V-Flash-WEB模型适配移动端App的技术路径
  • Playwright处理iframe和Shadow DOM的实战技巧
  • 【收藏必看】2024-2025年Multi-Agent全面爆发:6大主流框架深度解析,AI开发深水区避坑指南
  • 如何在Web端高效运行GLM-4.6V-Flash-WEB多模态模型?完整教程分享
  • 根据上一个测试用例的执行结果决定某一夹具的使用情况
  • 【珍藏干货】LangGraph年度学习总结:三大维度+三层架构,构建完整AI Agent知识体系
  • 关注地下水与地表水安全:农业 N/P 面源污染迁移机制、模拟方法与减排实践,从剖面淋失到区域负荷:农业面源污染评估的 N/P 迁移模拟进阶路径
  • 竞赛毕业设计定制作品---【芳心科技】F. 基于单片机摩托车发动机温度控制系统设计
  • 46、线程邮箱系统(C语言+多线程通信)
  • 如何在 Ubuntu 22.04 服务器上通过 Ansible 自动化管理 Docker 容器,简化部署与更新流程?
  • 提升多模态AI项目效率:GLM-4.6V-Flash-WEB快速上手经验分享