让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 timefrom selenium import webdriver #导入浏览器驱动def smart_wait(self, element_id): # 智能等待时间,60秒超时for i in range(60): # 循环60次,从0至59if i >= 59 : # 当i大于等于59时,打印提示时间超时print("timeout")breaktry: # try代码块中出现找不到特定元素的异常会执行except中的代码if self.browser.find_element_by_id(element_id): # 如果能查找到特定的元素id就提前退出循环breakexcept: # 上面try代码块中出现异常,except中的代码会执行打印提示会继续尝试查找特定的元素idprint("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 将浏览器原生 ...
随机推荐
- Palindromes in a Tree CodeForces - 914E
https://vjudge.net/problem/CodeForces-914E 点分就没一道不卡常的? 卡常记录: 1.把不知道为什么设的(unordered_map)s换成了(int[])s ...
- Eclipse的ant调用maven
需要在 eclipse 的 windows - preferences - ant - runtime - classpath - global entries 加入 eclipse 里面的 jsch ...
- css新奇技术及其未来发展
1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...
- sleep与wait的对比
链接:https://www.nowcoder.com/questionTerminal/eeff0fdb43034ee7b43838fb9de4519e来源:牛客网 sleep是线程类(Thread ...
- 学习ASP.NET MVC5的一个轻量级的NinJect框架学习的第二天
新建一个Abstract文件夹 放置一些抽象的类,如接口 我们通过该接口就可以得到对应类的相关信息, 不需要去管该数据如何存储,以及存储的位置,这就是存储库模式的本质 public i ...
- 如何创建你的第一个手机APP?
本文使用helloworld来作为android的入门项目,通过这个最简单的项目来帮助大家了解android程序开发包含哪些部分,以及如何运行android程序,本次开发android程序的工具是ec ...
- http响应头状态描述
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:1xx:指示信息--表示请求已接收,继续处理2xx:成功--表示请求已被成功接收.理解.接受3xx:重定向--要完成请求必须进行更 ...
- (转)使用Spring的注解方式实现AOP入门
http://blog.csdn.net/yerenyuan_pku/article/details/52865330 首先在Eclipse中新建一个普通的Java Project,名称为spring ...
- CFBundleURLTypes URL scheme
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Ar ...
- 图形学基础 | 实现OBJ文件的载入
1. tiny_obj_loader.h 的使用include这个头文件需要先定义一个宏 #define TINYOBJLOADER_IMPLEMENTATION#include "tiny ...