让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 将浏览器原生 ...
随机推荐
- 转 多个版本的数据库在同一服务器上ORA-12557
http://blog.chinaunix.net/uid-42518-id-3153473.html 问题描述:当同一台机子上安装了多个版本的数据库,可能在连接库或ASM时会报以下错误.ORA-12 ...
- D. Taxes 哥德巴赫猜想
http://codeforces.com/contest/735/problem/D 这题其实我还不是很懂,那个只是猜想,然而却用了. 只想说说找到第一小于n的素数这种思路是不行的. 121 = 1 ...
- MySQL FailOver(官方自带,free)
为什么 传统复制和GTIDs切换的缺点 当replication故障出现之后,最头疼是replication架构的调整 一旦master down了,就需要配置某一台slave作为master sla ...
- Spark-SQL连接Hive
第一步:修个Hive的配置文件hive-site.xml 添加如下属性,取消本地元数据服务: <property> <name>hive.metastore.local< ...
- .net 音频转换 .amr 转 .mp3 (ffmpeg转换法)
最近看来是跟声音干上了啊! 音频转换的第二种方法,这种方法相对第一种来说,要简单的多! 首先,你得下载个“ffmpeg.exe” 插件,然后把它放到你的项目中,如下图: 程序中会调用该文件,以助于转换 ...
- Java_静态变量
class c1c { private static int num = 0; private static double pi = 3.14; private double radius; priv ...
- EMAC IP 核
在有线连接的世界里,以太网(Ethernet)无所不在.以太网具有各种速度模式.接口方式.以及灵活的配置方式.现在的以太网卡都是10/100/1000Mbps自适应网卡.以太网的物理层(PHY)通常使 ...
- MyBatis学习(四)
前言 最近比较松懈,下班回家后也懒得学习了.今晚实在是看不下去了,争取时间学习.社会上有这么多的资源,就看谁能抢的多吧.今天就说说MyBatis的动态SQL吧 正文 动态 SQL 通常要做的事情是有条 ...
- 字符串循环右移-c语言
一个长度为len的字符串,对其循环右移n位 [期望]char str[] = "abcdefg";右移3次后,变成"efgabcd" [思路] 思路1. 如果用 ...
- Java String startsWith()方法
描述: 这个方法有两个变体并测试如果一个字符串开头的指定索引指定的前缀或在默认情况下从字符串开始位置. 语法 此方法定义的语法如下: public boolean startsWith(String ...