让Selenium稳定运行的技巧
Selenium简介
Selenium是非常流行的Web自动化测试工具。它具有自动化测试用例制作简单,支持多种浏览器和不同的操作系统等优点。
Selenium脚本不稳定的问题
有很多时候Selenium的自动化测试脚本运行并不是很稳定。经常会遇到系统明明正常运行,但是测试却失败的情况。例如,点击上传图片按钮并上传图片,如果在上传加载完成之前就操作下一步,会提示错误信息。
出现问题的原因可能是服务器的响应速度慢,在页面内容没有加载完毕的状态下Selenium就执行了下一条命令,从而导致测试失败。上面的上传图片场景,虽然在上传图片后可以加入固定的等待几秒钟的代码,但是因为上传图片的速度并不是固定的时间,当服务器的负载较高的时候,上传图片的速度变慢,所以造成了测试的失败。
脚本运行不稳定的解决方法
- 固定等待时间
上面的问题的解决方法之一就是使用python程序语言的sleep函数,来暂停固定秒数的时间,通过延迟执行下一条命令,多少能有所改善。但是这个方法为了解决偶尔发生的问题,不得不在测试(用例)脚本中插入很多sleep语句,会造成测试时间的变长,因此并不推荐。
下面是通过python语言来实现固定等待时间的相关代码:
import time
time.sleep(2) #默认等待2秒
- 设置智能等待时间
可以通过下面代码来设置selenium内置的智能等待时间,但是在上传图片等待的情况下智能等待没有生效。
from selenium import webdriver #导入浏览器驱动
browser = webdriver.Chrome("/home/kyle/bin/chromedriver")
browser.implicitly_wait(10) #设置智能等待10秒
- 更好的解决方法
通过利用python的异常捕获机制和循环语句,使程序在一定时间内即使selenium执行命令失败,也会继续重复执行同一条命令多次,直到成功为止。 下面是相关的python程序代码:
import time
from selenium import webdriver #导入浏览器驱动
def smart_wait(self, element_id): # 智能等待时间,60秒超时
for i in range(60): # 循环60次,从0至59
if i >= 59 : # 当i大于等于59时,打印提示时间超时
print("timeout")
break
try: # try代码块中出现找不到特定元素的异常会执行except中的代码
if self.browser.find_element_by_id(element_id): # 如果能查找到特定的元素id就提前退出循环
break
except: # 上面try代码块中出现异常,except中的代码会执行打印提示会继续尝试查找特定的元素id
print("wait for find element")
time.sleep(1)
实例说明
在实际测试工作中,有上传图片的场景,上传图片的时间和服务器的响应时间以及客户端网络状况有关系,所以有时候速度慢,有时候速度快。这种情况不适合使用固定等待时间的解决方法。可以通过上面提到的第二种方案来处理,先通过下面代码开始上传图片。
- browser.find_element_by_id(button_id).find_element_by_name("file").send_keys(file_path)
- # 注意:上面语句中find_element_by_id(button_id)中button_id为上传图片按钮的元素id
然后调用上面提到的smart_wait(check_id)函数,传入参数要查找的元素id,这个参数的id是下面截图中红框标记处的id。找到这个元素id证明上传图片已经成功,可以开始下一步操作,如果找不到这个元素id说明上传图片还没有完成,还需要继续等待上传完成。
如果selenium能找到这个元素id证明上传已经完成,会提前退出循环,继续执行下一步代码语句。如果找不到这个元素id就等待1秒之后继续查找,在默认的60次循环内直到找到为止。如果直到最后一次循环都没有找到想要的元素就打印提示信息:“timeout”。
让Selenium稳定运行的技巧的更多相关文章
- Selenium Grid 运行报错 Exception thrown in Navigator.Start first time ->Error forwarding the new session Empty pool of VM for setup Capabilities
Selenium Grid 运行报错 : Exception thrown in Navigator.Start first time ->Error forwarding the new se ...
- KoaHub.js可借助 Babel 编译稳定运行在 Node.js 环境上
koahubjs KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, A ...
- 本站已稳定运行了XX天,网页时间显示功能实现方法
这个是我昨晚上添加的效果, 分为三个部分: 1.本站已稳定运行了多少天的实现: 直接把下面代码复制到后台你想添加的位置即可. 1 2 3 4 5 6 7 8 9 本站已稳定运行了 <strong ...
- 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机
说明: 1.前段时间开源了一个网络摄像头的TCP版本 https://www.cnblogs.com/armfly/p/9173167.html,这次再来一个远程VNC的版本.使用更方便,无需大家制作 ...
- 如何让 Hexo 在服务器稳定运行
声明 本文地址:如何让 Hexo 在服务器稳定运行 背景 博客系统终于又搭建起来了(好一个又),但是每隔一段时间去访问自己的网站总是访问不到,去服务器查询 ps aux | grep hexo,发现 ...
- 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台
作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...
- 通过监控线程状态来保证socket服务器的稳定运行
云平台中使用的socket服务器是我们自己定义一套通信协议,并通过C#实现的一个socket服务. 该服务目前是和web服务一起运行在IIS容器中,通过启动一个永不退出的新线程来监听端口. 在开发的初 ...
- Mac上使用selenium自动运行chrome
一.用我们的老朋友pip把selenium装好 pip install selenium 二.用webdriver.Chrome启动Chrome浏览器 from selenium import web ...
- appium ,selenium ,webdriver 运行原理与机制
做测试开发的童鞋都知道,UI自动化你绕不开selenium, webdrvier, appium框架,那么这三者之间有什么关联,它们的原理是什么呢? 简单来说就是: Selenium2 将浏览器原生 ...
随机推荐
- printf格式化输出参数
1.类型 类型字符用以表示输出数据的类型,其格式符和意义如下表所示: 格式字符 意义 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0) x,X 以十六进 ...
- python_8(模块)
第1章 模块 1.1 概述 1.2 模块的分类 1.2.1 内置模块 1.2.2 扩展模块 1.2.3 模块安装 1.2.4 自定义模块第2章 模块之内置模块 2.1 collections模块 2. ...
- ubuntu 16.0.4安装MySQL5.7
系统版本 root@sishen:~# uname -a Linux sishen 4.10.0-35-generic #39~16.04.1-Ubuntu SMP Wed Sep 13 09:02: ...
- 【转】数据库CRUD操作
数据库CRUD操作 一.删除表 drop table 表名称 二.修改表 alter table 表名称 add 列名 数据类型 (add表示添加一列) alter table 表名 ...
- EEPROM介绍
EEPROM( Electrically Erasable Programmable Read Only Memory )全称是电气可擦除可编程只读存储器,是非易失存储器,可以访问到每个字节,容量比较 ...
- array_keys
<?php$array = array(0 => 100, "color" => "red");print_r(array_keys($arr ...
- 伪类的格式重点:父标签层级 & 当前标签类型
伪类的格式重点:父标签层级 & 当前标签类型 通过例子说明: css1: span:nth-of-type(2){color: red;} css2: span :nth-of-type(2) ...
- 在LXC Centos6-moban 编译安装mysql-5.6.36 时候遇见的报错
在LXC安装Centos6-moban 编译安装mysql-5.6.36 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.36 -DMY ...
- python程序的编辑和运行、变量
第一个python程序 python是解释型弱类型高级语言 常见的python解释器CPython.IPython.pypy.JPython.IronPython 方法一.python程序可以写在命令 ...
- 手工修改注册表激活windows xp法
手工修改注册表激活windows xp法: 1.安装原版windows xp 2.打开注册表regedit 3.找到主键 Hkey_Local_Machine\Software\Microsoft\W ...