Python+Selenium自动化测试项目实战
第 1 章 自动化测试
1.1、自动化测试介绍
自动化测试就是通过自动化测试工具帮我们打开浏览器,输入网址,输入账号密码登录,及登录后的操作,总的说来自动化测试就是通过自动化测试脚本来帮我们从繁琐重复的手工测试里面解脱出来,把时间和精力花到更好的地方去,去挖掘更多的产品缺陷。
例如网上有一些人提供智慧树网、学习通等网课的刷课及答题的服务就是通过写自动化测试程序去完成的。还有一些高速抢票平台也是通过定时执行自动化程序脚本代替人工去抢票。
1.2、自动化测试优点
1. 更好的利用资源,节约人力成本;
2. 覆盖更全,提高工作效率;
3. 产品规格统一标准,增加软件的稳定性。
1.3、自动化测试缺点
问题:是不是自动化测试一定会取代手工测试?
答:不一定的,自动化测试只是帮我们从繁琐重复的手工测试里面解脱出来,把时间和精力花到更好的地方去,去挖掘更多的产品缺陷。因凡事都有利弊,自动化测试适合的场景是软件需求变更少,周期长,稳定性较强的项目。如果需求变更多,软件经常进行改版就不适合做整个系统的自动化测试了,因为每一次改版都要去维护测试脚本,但可以抽取部分稳定的功能做自动化测试。
1.4、自动化测试能解决的问题
-
高效完成回归测试。回归测试就项目在发新版本之后,对项目之前的功能进行验证;每一次小迭代,加了一个小功能可能会影响整个系统的功能,比如淘宝、京东等大型商城有几十万个商品列表,这样手工去回归验证就会非常麻烦。而使用自动化测试脚本,就可以根据迭代功能修改自动化测试的脚本去验证,没问题就上线,有问题就让开发改完再上线,这样就不用手工去一个个验证,这就是自动化测试的好处。
-
解决-兼容性测试,更换不同浏览器的驱动就可以解决兼容性测试。
-
提高测试效率,保证产品质量。
第 2 章 Python基础
2.1、Python常用快捷键
2.2、函数
在开发程序时,使用函数可以提高编写的效率以及代码的重用。
(1)函数的使用包含两个步骤:
1. 定义函数 —— 封装独立的功能;
2. 调用函数 —— 执行函数的代码;
(2)定义函数的格式如下:
函数名称应该能够表达函数封装代码的功能,方便后续的调用。
(3)变量作用域:
1. 局部变量只能在函数内部使用,局部变量从调用函数的时候开始在内存出现,函数调用完毕,局部变量从内存消失;
2. 全局变量从定义变量开始在内存中出现,一直到程序运行完成,和程序一起从内存中消失。
在其他的开发语言中,大多不推荐使用全局变量,因为可变范围太大,导致程序不好维护!
2.3、面向对象编程
面向对象就是将世间万物抽象成一个类,然后形成相应的对象。
(1)类
类就是一个模板,是对一群具有相同特征或者行为的事物的一个统称,是抽象的模板,不能直接使用。
1.类的特性----属性;
2.类中行为----方法;
比如猫这个类有年龄,姓名,主人等属性,有学习、跑步、吃饭、睡觉等方法。
(2)对象
对象就是类的实例化,比如猫这个类可以实例化,具体是什么猫。
(3)面向对象程序设计三大特性:
-
封装:根据职责将属性和方法封装到一个抽象的类中,需要用到的时候导包,就可以调用属性和方法了;
-
继承:实现代码的重用,子类继承父类就可以拥有父类的属性和方法,这样相同的代码不需要重复的编写;
-
多态:不同的对象调用相同的方法,产生不同的执行结果,这样可以增加代码的灵活度。
第 3 章 元素定位方式
3.1、Selenium3.x提供了八种定位元素方式
1. id
2. name
3. class_name
4. tag_name
5. link_text
6. partial_link_text
7. CSS选择器
8. XPath
3.2、id选择器
#找到输入框id后,选中输入框,输入"鹰迅课堂"关键词。
driver.find_element_by_id("kw").send_keys("鹰迅课堂")
3.3、name选择器
driver.find_element_by_name("wd")).send_keys("鹰迅课堂")
3.4、class_name选择器
driver.find_element_by_class_name("s_ipt").send_keys("鹰迅课堂")
3.5、tag_name标签名选择器
ind_element_by_tag_name() 通过标签名去定位,页面相同的标签名重复率多,基本不用。
3.6、link_text超链接内容选择器
driver.find_element_by_link_text("点击进入所有课程").click()
3.7、partial_link_text模糊查询
driver.find_element_by_partial_link_text("所有课程").click()
3.8、CSS选择器
driver.find_element_by_css_selector("div.row:nth-child(5) > div:nth-child(2) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > a:nth-child(1)").click()
3.9、XPath定位方式
driver.find_element_by_xpath("/html/body/div/main/div/div/div[4]/div[2]/div/div/div/div[1]/a").click()
3.10、总结
-
定位到一个网页元素后,有输入框使用send_keys(),没有输入框,如果是按钮就用click()进行点击。
-
很多时候页面的元素可能是没有id的,没有唯一标识,需求评审的时候可以跟开发约定,网页的元素尽量要有唯一的id和name。
3.11、selenium4定位方式新写法
第 4 章 元素 | 浏览器操作方法
4.1、元素常用操作方法
4.2、操作浏览器常用方法
第 5 章 元素等待
元素等待就是——在定位页面元素时如果未找到,会在指定时间内一直等待的过程。
5.4、为什么要设置元素等待
-
网络速度慢
-
电脑配置低
-
服务器处理请求慢
5.4、强制等待
from time import sleep
sleep(10)
强制等待10秒,再执行下一步,缺点是不管资源是不是完成,都必须等待指定的时间。
5.4、隐式等待
(1)概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待,执行下一步;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException 。
(2)方法:driver.implicitly_wait(timeout) (timeout:为等待最大时长,单位:秒) ,driver.implicitly_wait(10) ,最长等待10秒。
(3)说明:隐式等待只需要设置一次,就会作用于全局所有的元素。
5.4、显式等待
概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则程序每隔N秒检查一次,如果检查到目标元素,加载完成,执行下一步,否则继续等待,直到超过设置的最长时间,则抛出超时异常 TimeoutException 。
在Selenium中把显式等待的相关方法封装在WebDriverWait类中。
练习题:打开百度,使用显性等待定位百度输入框,如果元素存在,就输入"www.yxclass.net"。
5.4、隐性等待与显性等待的区别
-
作用域不同:隐式为全局元素,是设置全局的等待,显式等待为单个元素有效。
-
使用方法不同:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中。
-
达到最大超时时长后抛出的异常不同:隐式等待默认检测频率为0.5s,超时异常为NoSuchElementException;显式等待超时异常为TimeoutException。
第 6 章 鼠标和键盘操作
6.1、鼠标操作
常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相应的操作方法。
6.2、鼠标操作的方法
(1)说明:
在Selenium中将操作鼠标的方法封装在ActionChains类中。
(2)实例化对象:
action = ActionChains(driver)
(3)执行鼠标事件原理:
在ActionChains类中所有提供的鼠标事件方法,在调用的时候,所有的行为都存储在ActionChains对象中,调用ActionChains的方法时不会立即执行,会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的事件会依次执行,先进先出,后进后出。
(4)强调:必须调用perform()方法才能执行鼠标事件。
(5)支持链式写法或者分步写:
ActionChains(driver).click(ele).perform()
(6)鼠标和键盘常用方法列表:
(7)鼠标和键盘常用方法:
(8)例题
6.3、键盘操作练习题
(1)Selenium中把键盘的按键都封装在Keys类中,使用时要导包。
(2)导包:from selenium.webdriver.common.keys import Keys
6.4、常用的键盘操作
练习题:在百度浏览器搜索框输入www.yxclass.net,然后粘贴到搜狗浏览器的搜索框进行搜索。
6.5、自动化测试答题
单选框是这样答,多选题也是一样的回答方法。
6.6、弹窗处理
应用场景:
-
删除在线商城购物车的商品,在删除时,需要选择是否删除。
-
在播放视频课程中也会有一些答题窗口,答题后才能继续播放视频。
弹出框处理方法:
-
获取弹出框对象:alert = driver.switch_to.alert
-
调用:
-
alert.text --> 返回alert/confirm/prompt中的文字信息
-
alert.accept() --> 接受对话框选项
-
alert.dismiss() --> 取消对话框选项
练习题:点击confirm后,弹出页面提示框选择“确定”。
答了一题没法自动切换到下一题的话,就要调用switch_to_alert()方法切换窗口。
6.7、下拉选择框
(1)说明:
Select类是Selenium为操作select标签特殊封装的。
(2)实例化对象:
select = Select(element)
element: <select>标签对应的元素,通过元素定位方式获取,
例如:driver.find_element_by_id("index")
(3)操作方法:
(4)Select类实现步骤分析:
(5)示例代码:
6.8、滚动条
selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。
1.设置JavaScript脚本控制滚动条
js = "window.scrollTo(0,1000)"
#(0:左边距;1000:上边距;单位像素)
示例:滑动到最底层
js1 = "window.scrollTo(0,10000)"
driver.execute_script(js1)
2. selenium调用执行JavaScript脚本的方法
driver.execute_script(js)
示例:滑动到最顶层
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)
练习题:滑动到鹰迅课堂网站的最底层。
6.9、窗口截图
说明:在Selenium中,提供了截图方法,需要进行截图时我们只需要调用即可方法:driver.get_screenshot_as_file(imgpath) #imgpath:图片保存路径。
6.10、跳过验证码
(1)验证码说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性。
(2)解决验证码问题的几种常用处理方式:
-
去掉验证码:测试环境下采用;
-
设置万能验证码:开发环境和测试环境下采用;
-
验证码识别技术:通过Python-tesseract来识别图片类型验证码;识别率很难达到100%;
-
记录cookie:通过记录cookie进行跳过登录。
(3)跳过验证码登录百度
BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到账号的控制权。
第 7 章 UnitTest+PyTest
7.1、UnitTest介绍
UnitTest是python自带的自动化测试框架;
UnitTest主要包含的内容:
-
TestCase(测试用例)
-
TestSuite(测试套件,把多个TestCase集成到一个测试TestSuite中,按照从上往下顺序执行)
-
TestRunner(执行测试用例)
-
TestLoader(自动从代码中加载多个测试用例TestCase)
-
Fixture(UnitTest特性)
7.2、PyTest
pytest 是 python 的一种单元测试框架,同自带的 UnitTest 测试框架类似,相比于 UnitTest 框架使用起来更简洁,效率更高
pytest 在运行自动化脚本的前后会执行两个特殊的方法,分别是 setup 和 teardown 。在执行脚本之前会执行 setup 方法,在执行脚本之后会执行 teardown 方法。有了这两个方法,我们可以在 setup 中进行获取驱动对象的操作,在 teardown 中进行关闭驱动对象的操作。
第 8 章 项目实战并自动发送测试报告邮件
需求:测试鹰迅课堂所有已经上线了的课程。
代码:
自动发送测试邮件
测试用例设计应该解耦,独立运行,脚本应该按照模块化分层。这样在软件每次迭带的时候,就可以根据迭带情况快速修改对应模块的自动化测试脚本了。
执行用例时就会进行截图。
脚本执行结束后,就自动发送测试报告邮件了。
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
相关文章:

Python+Selenium自动化测试项目实战
第 1 章 自动化测试 1.1、自动化测试介绍 自动化测试就是通过自动化测试工具帮我们打开浏览器,输入网址,输入账号密码登录,及登录后的操作,总的说来自动化测试就是通过自动化测试脚本来帮我们从繁琐重复的手工测试里面解脱出来&…...

WPS部分快捷操作汇总
记录一些个人常用的WPS快捷操作 一、去除文档中所有的超链接: 1、用WPS打开文档; 2、用Ctrla全选,或者点击上方的【选择】-【全选】,选中文档全部内容; 3、按CTRLSHIFTF9组合键,即可一次性将取文档中所有…...

Kubernetes (K8s) 普及指南
在当今的云计算和微服务时代,Kubernetes(简称K8s)已经成为容器编排的标准工具。它帮助开发者和运维人员管理和部署应用程序,实现高可用性、可伸缩性和自我修复。本文将详细介绍Kubernetes的基本概念、核心组件、工作原理及其优势。…...

Oracle RAC 集群配置共享目录ACFS
Oracle RAC 集群配置共享目录ACFS 应用场景:创建的ACFS文件系统用于部署OGG做数据同步使用。 1、创建共享磁盘组 create diskgroup OGG external redundancy disk /dev/mapper/ASM08, /dev/mapper/ASM09; 2、创建 acfs 文件系统 ACFS文件系统 在ASM磁盘组中通过A…...

Google Cloudbuild yaml file 中 entrypoint 和 args 的写法
编写cloudbuild.yaml 时有几个关键参数 entrypoint 和 args 的基本介绍 id: 显示在 cloud build logs 里的item 名字 name: docker 镜像名字 - 下面的命令会在这个镜像的1个容器instance 内执行 entrypoint: 执行的命令入口 , 只能有1个对象 args: 命名…...

鸿蒙开发接口图形图像:【@ohos.window (窗口)】
窗口 窗口提供管理窗口的一些基础能力,包括对当前窗口的创建、销毁、各属性设置,以及对各窗口间的管理调度。 该模块提供以下窗口相关的常用功能: [Window]:当前窗口实例,窗口管理器管理的基本单元。[WindowStage]&…...

LLM 基准测试的深入指南
随着越来越多的 LLM 可用,对于组织和用户来说,快速浏览不断增长的环境并确定哪些模型最适合他们的需求至关重要。实现这一目标的最可靠方法之一是了解基准分数。 考虑到这一点,本指南深入探讨了 LLM 基准的概念、最常见的基准是什么以及它们需要什么,以及仅依赖基准作为模…...

深入理解Redis事务、事务异常、乐观锁、管道
Redis事务与MySQL事务 不一样。原子性:MySQL有Undo Log机制,支持强原子性,和回滚。Redis只能保证事务内指令可以不被干扰的在同一批次执行,且没有机制保证全部成功则提交,部分失败则回滚。隔离性:MySQL的隔…...

17、Spring系列-SpringMVC-请求源码流程
前言 Spring官网的MVC模块介绍: Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称(spring-webmvc),但它通常被称为“ Spring MVC…...

对简单工厂模式、工厂方法模式、抽象工厂模式的简单理解
简单工厂模式 三部分组成 抽象类一些抽象类的具体实现类工厂类 把创建对象的任务交给一个工厂类来实现,对业务进行封装。 优点:实现了任务分离,客户端不用关心业务的具体实现,交由工厂来“生产”。 缺点:违背开闭原…...

PostgreSQL常用插件
PostgreSQL 拥有许多常用插件,这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件: 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用: pg_stat_k…...

mysql表字段超过多少影响性能 mysql表多少效率会下降
一直有传言说,MySQL 表的数据只要超过 2000 万行,其性能就会下降。而本文作者用实验分析证明:至少在 2023 年,这已不再是 MySQL 表的有效软限制。 传言 互联网上有一则传言说,我们应该避免单个 MySQL 表中的数据超过 …...

Vue进阶之Vue无代码可视化项目(一)
Vue无代码可视化项目 项目搭建初始步骤拓展:工程项目从0-1项目规范化package.jsoncpell.jsoncustom-words.txtts-eslint规则.eslintrc.cjsgit钩子检查有没有问题type-checkspellchecklint:stylehusky操作安装pre-commitpnpm的commit规范package.json:commitlint.config.cjs安装…...

初识C++ · 模拟实现list
目录 前言 1 push_back pop_back 2 迭代器类 2.1 ! 2.2 -- 2.3 * 3 Print_List 4 有关自定义类型 5 有关const迭代器 6 拷贝构造 赋值 析构 Insert erase 前言 有了string,vector的基础,我们模拟实现list还是比较容易的,这里同…...

电商运营-2024年6月1日
作为一名电商运营,针对淘工厂平台,需要具备以下核心技能和素质: 核心技能 新店入驻与产品管理 熟练掌握淘工厂平台的新店入驻流程,包括资质准备、资料提交、审核跟进等。精通产品上架技巧,确保产品信息准确、图片清晰…...

Go跨平台编译
1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:...

生产计划排产,制定每小时计划产量(“查表法”SQL计算)
根据日生产计划产量排产,制定每2小时理论计划生产产量。 每2小时计划产量 每2小时工作时间(秒)/生产计划节拍(秒)。 假设,生产计划节拍 : 25.0(秒)/台 工厂以每天8点00分钟作为当日工作日的…...

视频汇聚管理安防监控平台EasyCVR程序报错“create jwtSecret del server class:0xf98b6040”的原因排查与解决
国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,平台支持7*24小时实时高清视频监控,能同时播放多路监控视频流…...

头歌页面置换算法第2关:计算OPT算法缺页率
2 任务:OPT算法 2.1 任务描述 设计OPT页面置换算法模拟程序:从键盘输入访问串。计算OPT算法在不同内存页框数时的缺页数和缺页率。要求程序模拟驻留集变化过程,即能模拟页框装入与释放过程。 2.2任务要求 输入串长度作为总页框数目,补充程序完成OPT算法。 2.3算法思路 OPT算…...

vscode怎么拷贝插件到另一台电脑
说明 vscode插件默认存放在 C:\Users\用户名\.vscode 目录下的 extensions 文件夹中 方法 拷贝 C:\Users\用户名\.vscode 目录下的 extensions 文件夹到另一台电脑的C:\Users\用户名\.vscode 目录下 C:\Users\用户名\.vscode...

网络协议分析
网络协议分析 网络协议分析概述用IP实现异构网络互联网络协议的分层TCP/IP的分层模型协议分析协议分析应用协议分析任务 常见网络协议PPP协议报文选项IPCP认证协议PAP安全缺陷认证协议CHAPPPPoE协议流程 地址解析协议ARPARP的思想和步骤ARP报文格式及封装 移动IP移动IP的工作机…...

GAMIT目录配置
1打开home,显示隐藏文件,CTRH 2修改目录 #set gamitpath gamitpath/opt/gamit10.7 export PATH$PATH:${gamitpath}/com/:${gamitpath}/gamit/bin:${gamitpath}/kf/bin HELP_DIR${gamitpath}/help export HELP_DIR #set GMT path gmtpath/usr/lib/gmt P…...

基于JSP的九宫格日志网站
你好呀,我是学长猫哥!如果有需求可以文末加我。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:浏览器/服务器(B/S)结构 系统展示 首页 管理员功能模块 用户功能模块 摘要 本…...

C#中结构struct能否继承于一个类class,类class能否继承于一个struct
C#中结构struct能否继承于一个类class,类class能否继承于一个struct 答案是:都不能。 第一种情行,尝试结构继承类 报错:接口列表中的类型"XX"不是接口interface。 一般来说,都是结构只能实现接口&#x…...

【Vulhub】Fastjson 1.2.24_rce复现
文章目录 一,Fastjson是什么?二,fastjson漏洞原理三,判断是否有fastjson反序列化四,复现Fastjson 1.2.24_rce(vulhub)环境配置1.判断是否存在Fastjson反序列化2.反弹shell3.启动RMI服务器4.构造恶意POST请求 一&#x…...

【iconv】UTF-8字符串转换为UTF-16字符串
使用<iconv.h>来进行字符串编码的转换 #include <iconv.h> #include <iostream> #include <string.h> #include <unistd.h> #include <memory> #include <fcntl.h>// 需要链接iconv库// iconv -l 命令可列出所有支持的格式 // exam…...

AI技术的未来展望:重塑人类社会的智能革命
一、引言 随着技术的飞速发展,人工智能(AI)已经不再是科幻小说中的概念,而是成为了我们生活中不可或缺的一部分。从简单的智能助手到复杂的自动化生产线,AI技术正在以前所未有的速度改变着世界。本文将对AI技术的未来…...

掘金AI 商战宝典-系统班:2024掘金AIGC课程(30节视频课)
课程目录 1-第一讲学会向Al提问:万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲用AI写视频口播文案_1.mp4 4-第四讲用AI自动做视频(上)_1.mp4 5-第五讲用AI自动做视频(中)_1.mp4 6-第六讲用AI自动做视…...

C# WinForm —— 26 ImageList 介绍
1. 简介 图片集合,用于存储图像的资源,并在关联控件中显示出来 可以通过 索引、键名 访问每张图片 没有事件 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 imgList 开头ClolorDepth用于呈现图像的颜色数,默…...

Vue:现代前端开发的首选框架-【声明周期钩子详解】
引言 Vue.js 是一个流行的前端框架,它通过组件化的开发方式,让开发者能够构建出高效且可维护的应用程序。在Vue中,生命周期钩子(Lifecycle Hooks)是理解组件行为的关键概念。本文将深入探讨Vue生命周期钩子࿰…...