4-UI自动化-selenium三大等待操作

news2025/1/19 11:19:57

4-UI自动化-selenium三大等待方式

  • selenium三大等待方式
    • 强制等待timd.sleep
    • 隐式等待implicitly_wait
    • 显式等待WebDriverWait
  • 显式等待和隐式等待的区别

上篇介绍了3-UI自动化-八大元素定位,xpath定位方式和相关的常问面试题
本篇来学习三大等待方式

♡ \color{red}{\heartsuit}

在UI自动化测试中,脚本一定要加入等待来增强脚本的健壮性。因为基本上会遇到环境不稳定,网络慢的情况,如果不做任何等待处理的话,代码会由于没有找到元素而报错。另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到 wait。

selenium三大等待方式

timd.sleep(强制等待)
implicitly_wait(隐式等待)
WebDriverWait(显式等待)

强制等待timd.sleep

强制等待,最简单了,直接time.sleep(3),强制等待3s。哪里需要等待就在哪里设置

代码如下

import time

from selenium import webdriver
from selenium.webdriver.common.by import By


class WaitSample:
    def __init__(self):
        self.driver = webdriver.Firefox()
        # 在打开浏览器驱动等待3s,再去输入url
        time.sleep(3)
        self.driver.get('http://baidu.com')

    def force_wait(self):
        """强制等待"""
        # 输入关键词查询
        self.driver.find_element(By.ID, 'kw').send_keys('强制等待selenium')
        # 在点击百度一下前先等待2s
        time.sleep(2)
        self.driver.find_element(By.ID, 'su').click()
        # 在输出浏览器的标题前,先等待3s,防止浏览器还未
        time.sleep(3)
        print(self.driver.title)
        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()
if __name__ == '__main__':
    ws = WaitSample()
    # 强制等待
    ws.force_wait()

运行后控制台会输出浏览器标题
在这里插入图片描述

隐式等待implicitly_wait

implicitly_wait(隐式等待),每个元素在隐性等待设定好的等待时间上限内存在都不会报错,超出时间
上限就会抛超时异常。

import time

from selenium import webdriver
from selenium.webdriver.common.by import By


class WaitSample:
    def __init__(self):
        self.driver = webdriver.Firefox()
        # 在打开浏览器驱动等待3s,再去输入url
        time.sleep(3)
        self.driver.get('http://baidu.com')
        
    def imp_wait(self):
        """隐式等待"""
        # 隐式等待3s
        self.driver.implicitly_wait(3)
        self.driver.find_element(By.ID, 'kw').send_keys('隐式等待selenium')
        self.driver.find_element(By.ID, 'su').click()
        time.sleep(3)
        print(self.driver.title)
        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()
     
if __name__ == '__main__':
    ws = WaitSample()
    # 隐式等待
    ws.imp_wait()

注意隐式等待作用于整个driver周期,只需要在最开始设置一次就可以了,强制等待是哪里需要就在哪里设置。

显式等待WebDriverWait

显性等待需要指定

  • 等待的条件 expected_conditions
  • 定位元素的方式(也就是八大元素定位方式)
  • 等待的时间上限(自定义)
  • 等待的间隔(默认每隔0.5秒调用一次,可以不传)

显是等待会根据等待的条件判断,如果成立则往下执行,否则一直检查条件,直到达到最长等待时间。该方法是最常用的。

需要导入WebDriverWait模块和expected_conditions

先看WebDriverWait类的源码,初始化只需要传入浏览器对象和超时时间。POLL_FREQUENCY是调用until()/until_not()方法间隔时间,默认是0.5s

在这里插入图片描述
再看下WebDriverWait类有什么方法,可以看到有until()方法和until_not()方法,等待直到…,等待直到不…怎么怎么样。
在这里插入图片描述

比如说如果我们想要等待元素被加载后,才会进行下一步,用显示等待如何完成?

看下expectd_condictions的源码,它提供了很多方法,有标题等于,标题包含,当前文本元素值为…等方法,就不一一列举了。

主要列出几个常用的方法:

  • presence_of_element_located等待元素被加载,
  • visibility_of_element_located等待元素可见,
  • frame_to_be_available_and_switch_to_it等待窗口可见并切换到窗口,
  • element_to_be_clickable等待元素可被点击。

在这里插入图片描述

截取了presence_of_element_located()方法源码,可以看到传入的是一个locator对象,该对象用于查找元素,那么查找元素需要有元素定位方式和表达式,也就是locator=[By.ID, 'kw']是这种形式的。

def presence_of_element_located(locator):
    """ An expectation for checking that an element is present on the DOM
    of a page. This does not necessarily mean that the element is visible.
    locator - used to find the element
    returns the WebElement once it is located
    """

    def _predicate(driver):
        return driver.find_element(*locator)

    return _predicate

示例代码:

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

class WaitSample:
    def __init__(self):
        self.driver = webdriver.Firefox()
        # 在打开浏览器驱动等待3s,再去输入url
        time.sleep(3)
        self.driver.get('http://baidu.com')

    def util_wait(self):
        """显式等待"""
        # 先拿到显示等待对象
        explicitly_wait = WebDriverWait(self.driver, 3)
        # 等待直到元素可被加载
        locator = [By.ID, 'kw']
        explicitly_wait.until(expected_conditions.presence_of_element_located(locator)).send_keys('显示等待selenium')
        # self.driver.find_element(By.ID, 'kw').send_keys('隐式等待selenium')
        # 等待 直到元素可见
        locator2 = [By.ID, 'su']
        explicitly_wait.until(expected_conditions.visibility_of_element_located(locator2)).submit()
        # self.driver.find_element(By.ID, 'su').click()
        # time.sleep(3)
        explicitly_wait.until(expected_conditions.title_contains('显示等待selenium'))
        print(self.driver.title)
        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()
     
     
if __name__ == '__main__':
    ws = WaitSample()
    # 显式等待
    ws.explicitly_wait()

在这里插入图片描述

显式等待和隐式等待的区别

隐式等待可以全局设置,在整个浏览器对象内有用,但是它只能等待元素是否出现,元素的各种状态不能控制,而显式等待应用更广,更灵活,显式等待可以根据元素的状态条件决定执行下一步,如元素被加载,元素可见、元素可被点击等。

一般来说,现设置隐式等待,因为它可以作用于整个driver对象,然后根据实际情况设置强制等待或显示等待,如果想让自己的代码更智能推荐用显示等待。

三种等待方式最终的代码

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class WaitSample:
    def __init__(self):
        self.driver = webdriver.Firefox()
        # 在打开浏览器驱动等待3s,再去输入url
        time.sleep(3)
        self.driver.get('http://baidu.com')

    def force_wait(self):
        """强制等待"""
        # 输入关键词查询
        self.driver.find_element(By.ID, 'kw').send_keys('强制等待selenium')
        # 在点击百度一下前先等待2s
        time.sleep(2)
        self.driver.find_element(By.ID, 'su').click()
        # 在输出浏览器的标题前,先等待3s,防止浏览器还未
        time.sleep(3)
        print(self.driver.title)
        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()

    def imp_wait(self):
        """隐式等待"""
        # 隐式等待3s
        self.driver.implicitly_wait(3)
        self.driver.find_element(By.ID, 'kw').send_keys('隐式等待selenium')
        time.sleep(3)
        self.driver.find_element(By.ID, 'su').click()
        print(self.driver.title)
        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()

    def util_wait(self):
        """显式等待"""
        # 先拿到显示等待对象
        explicitly_wait = WebDriverWait(self.driver, 5)
        # 等待直到元素可被加载
        locator = [By.ID, 'kw']
        explicitly_wait.until(expected_conditions.presence_of_element_located(locator)).send_keys('显示等待selenium')
        # self.driver.find_element(By.ID, 'kw').send_keys('隐式等待selenium')
        # 等待 直到元素可见
        locator2 = [By.ID, 'su']
        explicitly_wait.until(expected_conditions.visibility_of_element_located(locator2)).submit()
        # self.driver.find_element(By.ID, 'su').click()
        # time.sleep(3)
        explicitly_wait.until(expected_conditions.title_contains('显示等待selenium'))
        print(self.driver.title)

        # 关闭窗口
        self.driver.close()
        # 退出浏览器
        self.driver.quit()


if __name__ == '__main__':
    ws = WaitSample()
    # 强制等待
    # ws.force_wait()
    # 隐式等待
    # ws.imp_wait()
    # 显式等待
    ws.util_wait()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用蓝牙实现无线定位(一)--系统原理

1. 简介 本项目将利用多个BLE4.0蓝牙模块,配合主控板、OLED显示屏等,构建一个无线定位系统。 本项目的系统构成为:3个信号塔,1个中控台,2个被定位的目标。 无线定位的用途有很多。比如,我们可以把固定的目…

zabbix拓扑图和聚合图形

目录 一、环境准备 1、搭建zabbix基础环境 2、创建被监控主机 二、拓扑图 1、拓扑图作用 2、拓扑图绘制步骤 三、聚合图形 1、聚合图形的作用 2、创建聚合图形 一、环境准备 1、搭建zabbix基础环境 zabbix基础环境部署参照:zabbix基础环境部署_桂安俊kyli…

方格取数 (两条路径,使得取得的数字和为最大)

设有 NN 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。 在走过的路上&#xff0…

Vue中的组件生命周期

一个组件从创建到销毁的过程 成为生命周期。 在我们使用Vue3 组合式API 是没有 beforeCreate 和 created 这两个生命周期的 组件生命周期如下: onBeforeMount() 在组件DOM实际渲染安装之前调用。在这一步中,根元素还不存在。onMounted() 在组件的第一次…

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

1、网关流控介绍 在微服务系统中,网关提供了微服务系统的统一入口,所以在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入…

R语言隐马尔可夫模型HMM识别不断变化的市场条件

了解不同的市场状况如何影响您的策略表现可能会对您的收益产生巨大的影响。最近我们被客户要求撰写关于隐马尔可夫模型的研究报告,包括一些图形和统计输出。 某些策略在波动剧烈的市场中表现良好,而其他策略则需要强劲而平稳的趋势,否则将面…

【PdgCntEditor】解决PDF的目录页码和PDF实际页码不一致的问题,书签页码偏移页面偏移功能,PDF页面标签的添加

一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码,两者之间存在一定的偏移值;导致我们看目录后面的页码,并不能直接借此数字索引到对应页面,非常麻烦。 二、改变页码标签 这是第一种方法&…

电脑技巧:Win10粘贴文件到C盘提示没有权限的解决方法

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

VMware升级手册

1. 概述 1.1 实施范围 本次实施涉及上海SMVIC虚拟化平台的7台物理服务器、7台ESXI节点、一台VC(6.7升级到7.0),以及广德、如皋两个集群迁移到7.0VC。 1.2 实施内容 本项目中需要实施内容包括: 2. 前置准备 升级确认: 3. WBS 4. 实施过程 4.1 VC部署 运行安装包,点击…

R语言生存分析数据分析可视化案例

目标 本文的目的是对如何在R中进行生存分析进行简短而全面的评估。关于该主题的文献很广泛,仅涉及有限数量的(常见)问题。最近我们被客户要求撰写关于生存分析的研究报告,包括一些图形和统计输出。 可用的R包数量反映了对该主题的…

SpringBoot 配置文件这样加密,才足够安全!

1. 前景 在使用Springboot时,通常很多信息都是在application.yml中直接明文配置的,比如数据库链接信息,redis链接信息等等。但是这样是不安全的。 所以需要对敏感数据进行加密,这样防止密码泄露 Jasypt这个库为我们解决了这个问…

[附源码]计算机毕业设计springboot-大学生健康档案管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

初识Pytest自动化测试框架,我彻底懂了

初识Pytest Pytest是Python实现的一个测试工具,可以用于所有类型和级别的软件测试。 Pytest是一个可以自动查找到你编写的用例并运行后输出结果的测试框架。 Pytest的特点: 是一个命令行工具,编写用例简单,可读性强非常容易上手…

2023年高企申报准备工作,明光市企业可以提前做这些准备

为了帮助企业提前准备和更好地开展2023年高新技术企业认定申报工作,安徽省大力鼓励企业申报高新技术企业,相应出台了相关政策,同时对于高企申报也有很多奖补,下面小编汇总了滁州市2023年申报,企业提前准备工作有哪些。…

黑群晖从入门到入土,自编译适合自己硬件的黑群晖7.1.x引导(黑群晖DSM7.X引导用arpl编译教程)

写在前面的话 没啥好说的,只需要感谢在GitHub上开源代码的巴西老哥就好,好了废话不多说直接开始。 黑群晖DSM7.X引导用arpl编译教程写在前面的话一、需要的软硬件清单二、制作引导盘1、下载arpl镜像2.1.1、制作PE启动盘,这是使用msata硬盘或…

3. Vue.js 3.0 响应式系统原理

1.响应式系统原理-介绍 接下来通过模拟Vue3的响应式系统来深入了解它内部的工作原理。先来回顾一下Vue3重写了响应式系统,和Vue2相比,Vue3的响应式系统底层采用proxy对象实现,在初始化的时候不需要遍历所有的属性,把属性通过defi…

C语言——结构体(入门)

文章目录1.结构体的声明1.1.结构体是什么?1.2.结构体的声明1.3.结构体的定义和初始化2.结构体成员的访问3.结构体传参1.结构体的声明 1.1.结构体是什么? 在生活中往往很难用一个准确的数据类型来描述一个物体,例如一本书,描述它…

编码技巧——Mybatis分页插件PageHelper使用

本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,Mybatis拦截器相关知识可参考Mybatis——拦截器Interceptor,本篇仅简单…

12_AJAX

知识点1【定时器】(重要) 知识点2【日期Date对象】 知识点3【Math数学对象】(了解) ​编辑 知识点4【string对象】 indexof函数: substring()函数: 知识点5【全局函数】(了解) …

Android使用高德地图实现运动轨迹绘制和轨迹回放

功能的实现完全是使用高德地图进行实现的,先看一下效果图吧! 下图是在绘制轨迹的过程: 下图是在轨迹回放的过程: 下图是记录运动的时间区间: 其实这个实现起来还是很容易的,总体逻辑就是:定位—…