selenium python 实现基本自动化测试的示例代码

安装selenium

打开命令控制符输入:pip install -U selenium

火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能

Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回放功能,IDE 录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,下载地址:Selenium IDE – Get this Extension for 🦊 Firefox (en-US)

如何使用IDE录制脚本:点击seleniumIDE——点击录制——开始录制——录制完成后点击文件Export Test Case——python/unittest/Webdriver——保存;

安装python

安装的时候,推荐选择“Add exe to path”,将会自动添加Python的程序到环境变量中。然后可以在命令行输入 python -V 检测安装的Python版本。

浏览器内壳:IE、chrome、FireFox、Safari

1、webdriver:用unittest框架写自动化用例(setUp:前置条件,tearDown清场) 

import unittest
from selenium import webdriverclass Ranzhi(unittest.TestCase):def setUp(self):self.driver = webdriver.Firefox() #选择火狐浏览器def test_ranzhi(self):passdef tearDown(self):self.driver.quit()#退出浏览器

2、断言,检查跳转的网页是否和实际一致

断言网址时需注意是否为伪静态(PATH_INFO)或者GET,前者采用路径传参数(sys/user-creat.html),后者通过字符查询传参数(sys/index.php?m=user&f=index)

当采用不同方式校验网址会发现变化。

1

2

self.assertEqual("http://localhost:8080/ranzhi/www/s/index.php?m=index&f=index",

        self.driver.current_url, "登录跳转失败")

3、定位元素,在html里面,元素具有各种各样的属性。我们可以通过这样唯一区别其他元素的属性来定位到这个元素.

  WebDriver提供了一系列的元素定位方法。常见的有以下几种:id,name,link text,partial link text,xpath,css seletor,class,tag.

self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()
self.driver.find_element_by_id('account').send_keys('admin')
self.driver.find_element_by_link_text(u'退出').click()

 

定位元素需注意的问题:

a.时间不够,采用两种方式(self.implicitly_wait(30),sleep(2))

b.函数嵌套(<iframe></iframe>)

# 进入嵌套self.driver.switch_to.frame('iframe-superadmin')
#退出嵌套self.driver.switch_to.default_content()

c.flash,验证码(关闭验证码或使用万能码)

d.xpath问题:最好采用最简xpath,当xpath中出现li[10]等时需注意,有时页面定位会出现问题

4、采用CSV存数据

CSV:以纯文本形式存储表格数据(数字和文本),CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。

melody101,melody101,m,1,3,123456,@qq.com
melody102,melody101,f,2,5,123456,@qq.com
melody103,melody101,m,3,2,123456,@qq.com
import csv
# 读取CSV文件到user_list字典类型变量中
user_list = csv.reader(open("list_to_user.csv", "r"))
# 遍历整个user_list
for user in user_list:sleep(2)self.logn_in('admin', 'admin')sleep(2)# 读取一行csv,并分别赋值到user_to_add 中user_to_add = {'account': user[0],'realname': user[1],'gender': user[2],'dept': user[3],'role': user[4],'password': user[5],'email': user[0] + user[6]}self.add_user(user_to_add)

5、对下拉列表的定位采用select标签

from selenium.webdriver.support.select import Select
# 选择部门
dp =self.driver.find_element_by_id('dept')
Select(dp).select_by_index(user['dept'])
# 选择角色
Select(self.driver.find_element_by_id('role')).select_by_index(user['role'])

 6、模块化代码

需要对自动化重复编写的脚本进行重构(refactor),将重复的脚本抽取出来,放到指定的代码文件中,作为共用的功能模块。使用模块化代码注意需倒入该代码。

#模块化代码后引用,需导入代码模块
from ranzhi_lib import RanzhiLib
self.lib = RanzhiLib(self.driver)
# 点击后台管理
self.lib.click_admin_app()
sleep(2)
# 点击添加用户
self.lib.click_add_user()
# 添加用户
self.lib.add_user(user_to_add)
sleep(1)
# 退出
self.lib.logn_out()
sleep(2)class RanzhiLib():# 构造方法def __init__(self, driver):self.driver = driver

7、自定义函数运行的先后顺序:完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,在PyUnit中是用TestSuite类来表示,采用unittest.TestSuite()。

PyUnit使用TestRunner类作为测试用例的基本执行环境,来驱动整个单元测试过程。Python开发人员在进行单元测试时一般不直接使用TestRunner类,而是使用其子类TextTestRunner来完成测试。

# 构造测试集
suite = unittest.TestSuite()
suite.addTest(RanzhiTest("test_login"))
suite.addTest(RanzhiTest("test_ranzhi"))# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)

以下代码为登录“然之系统”,进入添加用户,循环添加用户并检测添加成功,再退出的过程。以下程序分别为主程序,模块化程序,执行程序,CSV文件

import csv
import unittest
from time import sleepfrom selenium import webdriver
# 模块化代码后引用需导入代码模块
from ranzhi_lib import RanzhiLibclass Ranzhi(unittest.TestCase):def setUp(self):self.driver = webdriver.Firefox()self.lib = RanzhiLib(self.driver)# 主函数def test_ranzhi(self):# 读取CSV文件到user_list字典类型变量中user_list = csv.reader(open("list_to_user.csv", "r"))# 遍历整个user_listfor user in user_list:sleep(2)self.lib.logn_in('admin', 'admin')sleep(2)# 断言self.assertEqual("http://localhost:8080/ranzhi/www/sys/index.html",self.driver.current_url,'登录跳转失败')# 读取一行csv,并分别赋值到user_to_add 中user_to_add = {'account': user[0],'realname': user[1],'gender': user[2],'dept': user[3],'role': user[4],'password': user[5],'email': user[0] + user[6]}# 点击后台管理self.lib.click_admin_app()# 进入嵌套self.lib.driver.switch_to.frame('iframe-superadmin')sleep(2)# 点击添加用户self.lib.click_add_user()# 添加用户self.lib.add_user(user_to_add)# 退出嵌套self.driver.switch_to.default_content()sleep(1)# 退出self.lib.logn_out()sleep(2)# 用新账号登录self.lib.logn_in(user_to_add['account'], user_to_add['password'])sleep(2)self.lib.logn_out()sleep(2)def tearDown(self):self.driver.quit()
from time import sleepfrom selenium.webdriver.support.select import Selectclass RanzhiLib():# 构造方法def __init__(self, driver):self.driver = driver# 模块化添加用户def add_user(self, user):driver = self.driver# 添加用户名ac = driver.find_element_by_id('account')ac.send_keys(user['account'])# 真实姓名rn = driver.find_element_by_id('realname')rn.clear()rn.send_keys(user['realname'])# 选择性别if user['gender'] == 'm':driver.find_element_by_id('gender2').click()elif user['gender'] == 'f':driver.find_element_by_id('gender1').click()# 选择部门dp = driver.find_element_by_id('dept')Select(dp).select_by_index(user['dept'])# 选择角色role = driver.find_element_by_id('role')Select(role).select_by_index(user['role'])# 输入密码pwd1 = driver.find_element_by_id('password1')pwd1.clear()pwd1.send_keys(user['password'])pwd2 = driver.find_element_by_id('password2')pwd2.send_keys(user['password'])# 输入邮箱em = driver.find_element_by_id('email')em.send_keys(user['email'])# 点击保存driver.find_element_by_id('submit').click()sleep(2)# 登录账号def logn_in(self, name, password):driver = self.driverdriver.get('http://localhost:8080/ranzhi/www')sleep(2)driver.find_element_by_id('account').clear()driver.find_element_by_id('account').send_keys(name)driver.find_element_by_id('password').clear()driver.find_element_by_id('password').send_keys(password)driver.find_element_by_id('submit').click()sleep(2)# 退出账号def logn_out(self):self.driver.find_element_by_id('start').click()sleep(4)self.driver.find_element_by_link_text(u'退出').click()sleep(3)# 点击后台管理def click_admin_app(self):self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()sleep(1)def click_add_user(self):self.driver.find_element_by_xpath('//*[@id="shortcutBox"]/div/div[1]/div/a/h3').click()sleep(3)
import unittestfrom ranzhi import Ranzhiclass RanzhiTestRunner():def run_tests(self):suite = unittest.TestSuite()suite.addTest(Ranzhi('test_ranzhi'))runner = unittest.TextTestRunner()runner.run(suite)if __name__ == "__main__":ranzhi_test_runner = RanzhiTestRunner()ranzhi_test_runner.run_tests()
melody109,melody101,m,1,3,123456,@qq.com
melody106,melody101,f,2,5,123456,@qq.com
melody107,melody101,m,3,2,123456,@qq.com
​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

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

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

相关文章

nodejs+vue+elementui校园演出赞助艺术资源管理系统

系统主要分为系统管理员和学生、校外人员三个部分&#xff0c;系统管理员主要功能包括&#xff1a;首页、个人中心、学生管理、校外人员管理、社团信息管理、校内演出管理、校外商演管理、系统管理&#xff1b;基本上实现了整个基于vue的校园艺术资源管理系统的设计与实现信息管…

$sformat在仿真中打印文本名的使用

在仿真中&#xff0c;定义队列&#xff0c;使用任务进行函数传递&#xff0c;并传递文件名&#xff0c;传递队列&#xff0c;进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串&#xff0c;在仿真的时候进行文件…

EA电源维修EA-PS 9750-60直流电源维修Elektro-Autοmαtik

德国EA Elektro-Autοmαtik全系列电源维修EA-PS 80003U系列 这些μ-处理器控制和可编程重型的实验室电源提供了一个灵活的“自动量程”无论是高电压或高电流在额定功率输出&#xff0c;允许使用。配件包括数字编码器可用于设置电压&#xff0c;电流和功率&#xff0c;完整的4…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…

绘制纹理C++

用数学和C绘制一些纹理 sin(x * x y * y) int main() {int width 400; // 宽度int height 400; // 高度Mat texture Mat::zeros(height, width, CV_8UC1);for (int y 0; y < height; y) {for (int x 0; x < width; x) {int value static_cast<int>(255 * …

基于go文件同步工具的升级迭代

介绍 同样&#xff0c;该工具适用于多个项目不同版本的维护&#xff0c;文件更新和新增的同步(自动创建目录)&#xff0c;支持自动提交svn。 升级迭代 之前的文件同步工具&#xff0c;依赖chrome和http包&#xff0c;有时候js加载页面不太稳定&#xff0c;所以有空闲就升级迭…

什么是TDR(威胁检测与响应)

网络安全是被动和主动方法的混合体。过去&#xff0c;企业往往局限于被动的方法&#xff0c;随着合规性和安全策略越来越受到重视&#xff0c;主动方法也越来越受到关注。与其他行业相比&#xff0c;网络安全是高度动态的&#xff0c;网络安全团队采用任何可以帮助他们优化的新…

MinIo 的操作与使用

文章目录 一、Client 连通 官方 API 文档&#xff1a;Documentation 官方中文文档&#xff1a;MinIO中文文档 一、Client 连通 Java 代码&#xff1a; MinioClient minioClient MinioClient.builder().endpoint("http://192.168.110.110:9000").credentials("x…

Redis服务器安装配置

Redis是一种开源的NoSQL内存数据库&#xff0c;用于高性能的数据存储和访问。Redis支持多种数据类型&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;并且支持分布式存储和操作。Redis的特点包括快速、高可用和易扩展等&#xff0c;适用于各种应用场景。 一、…

leetcode:LCR 122. 路径加密(python3解法)

难度&#xff1a;简单 假定一段路径记作字符串 path&#xff0c;其中以 "." 作为分隔符。现需将路径加密&#xff0c;加密方法为将 path 中的分隔符替换为空格 " "&#xff0c;请返回加密后的字符串。 示例 1&#xff1a; 输入&#xff1a;path "a.a…

ES-环境安装(elasticsearch:7.17.9,kibana,elasticsearch-head)

ES 环境搭建 1 拉取镜像 常用三件套 docker pull kibana:7.17.9 docker pull elasticsearch:7.17.9 docker pull mobz/elasticsearch-head:52 启动镜像 elasticsearch 安装 这里可以先不挂载文件启动一波&#xff0c;然后把容器里的文件拷贝出来 docker run -p 19200:9200 …

机器学习---朴素贝叶斯分类器的实现(对文本进行侮辱性言论和非侮辱性言论的分类)

1. loadDataSet函数 import numpy as np# 构造loadDataSet函数用于生成实验样本 def loadDataSet(): postingList[[my, dog, has, flea, problems, help, please],[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, postin…

从零开始学习 JS APL(一):完整指南和实例解析

本章内容主要是按一下来&#xff1a; 操作DOM BOM 比如 控制网页元 素交互等各种网页 交互效果 以下是我总结笔记&#xff08;仅供参考&#xff09; webAPL 获取DOM对象 变量声明有三个 var let 和 const 我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法…

JOSEF约瑟 同步检查继电器DT-13/200 100V柜内安装,板前接线

系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 100V柜内板前接线 一、用途 DT-13型同步检查继电器用于两端供电线路的…

linux系统下农场种菜小游戏!

linux系统下农场种菜小游戏&#xff01; 今天给大家分享一个linux系统下一个简单的小游戏 源码如下&#xff0c;在linux系统下创建一个.sh的脚本文件&#xff0c;复制粘贴进去即可&#xff01; #!/bin/bash# 初始化变量 vegetables("生菜" "西兰花" &qu…

SpringBoot启动流程

SpringBoot启动流程 文章目录 SpringBoot启动流程SpringBoot启动流程 SpringBoot启动流程 视频链接&#xff1a; https://www.bilibili.com/video/BV15b4y1a7yG/?p174&spm_id_frompageDriver&vd_sourcef6debc5a79e3f424f9dde2f13891b158 看李老师讲的吧&#xff0c;特…

服务器数据恢复—服务器断电导致XenServer数据文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌720服务器搭配该品牌某型号RAID卡&#xff0c;使用4块STAT硬盘组建了一组RAID10阵列。服务器上部署XenServer虚拟化平台&#xff0c;系统盘 数据盘两个虚拟机磁盘。虚拟机上安装的是Windows Server操作系统&#xff0c;作为Web服务器使用…

虾皮助手:提升Shopee卖家运营效率的必备辅助工具

随着电商市场的快速发展&#xff0c;越来越多的卖家选择在Shopee平台上开设在线商店。然而&#xff0c;随之而来的是更多的竞争和挑战。为了在这个竞争激烈的市场中脱颖而出&#xff0c;卖家们需要寻找一种工具来帮助他们更高效地管理和运营他们的店铺。虾皮助手&#xff08;Sh…

CSS特效026:扇骨打开关闭的动画

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

vue创建项目,使用可视化界面安装插件

安装项目&#xff1a; vue create vue-app 选择默认配置就行&#xff0c;也可以按需选择自定义配置 vue ui通过可视化管理项目 通过可视化安装全家桶插件