你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)
想看更多 那就点个关注吧 我会尽力带来有趣的内容
本文档是一年前学后记得笔记 现在居然还记得很清楚 基于黑马程序员的 软件测试web自动化测试,Web自动化流程精讲和移动自动化测试环境_哔哩哔哩_bilibili 这套技术
目前 本人对软件测试技术已经有了更深刻的理解,如果你想看,可以在评论区告诉我,我会安排上。刚才扫了两眼之前自己写的这份文档,感觉学的很浅
自动化测试
自动化测试-Selenium 的操作
python中的self对象相当于java中的this
https://selenium.dev/downloads/
驱动下载
![](https://file.jishuzhan.net/article/1790246055514738690/8175ae5054758718367f6feff27c50d0.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/80326bbad6667c7b47bc204549eb3d11.webp)
- 使用css_selector来定位元素时,前面不加就是元素本名,加上.就是id
![](https://file.jishuzhan.net/article/1790246055514738690/a9f30f122c52dfd7d8799c217017d03d.webp)
元素操作
![](https://file.jishuzhan.net/article/1790246055514738690/061915074d707a42efe85407deac0f18.webp)
浏览器操作
获取元素信息
鼠标操作
** **
键盘操作
![](https://file.jishuzhan.net/article/1790246055514738690/fbd694656c48e93b2b4c40b6d746a64f.webp)
隐式等待
![](https://file.jishuzhan.net/article/1790246055514738690/55727122fe70fc93dd4907a82c0cf514.webp)
显示等待
![](https://file.jishuzhan.net/article/1790246055514738690/4fdb75391bdc06f6a407960de7be310d.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/82af250a9e88d320035fd883785d23aa.webp)
lambda表达式
![](https://file.jishuzhan.net/article/1790246055514738690/400ff4ddf688fb695986cf3d046bc754.webp)
- 以上代码等同于
python
f = lambda x: x * x
print(f(5)) # 25
该表达式相当于一行函数的表达式
显示等待,使用lambda解决问题
python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 显示等待
from selenium.webdriver.support.wait import WebDriverWait
driver=webdriver.Chrome()
driver.implicitly_wait(10)
url=r"E:\课堂素材\注册A.html"
driver.get(url)
driver.maximize_window()
#此处WebDriverWait将传入的driver赋值给self._driver(一个实例对象的中的属性),until方法调用了self._driver,因此,x为driver
a=WebDriverWait(driver,timeout=10,poll_frequency=0.4).until(lambda x:x.find_element(By.ID,'userA'))
a.send_keys("aaa")
# 隐式等待
下拉框
![](https://file.jishuzhan.net/article/1790246055514738690/b54a895aff7fe8e8745fd28de14777a4.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/e09d1031e89c80b5dda89436778f10e0.webp)
弹出框
![](https://file.jishuzhan.net/article/1790246055514738690/2b4473a75c6e01cdf65872113dbce983.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/c9074a22382d3ecc578322908df2ed3f.webp)
注册条
![](https://file.jishuzhan.net/article/1790246055514738690/507061e7175ff04ef352c939db29d4fb.webp)
frame切换
![](https://file.jishuzhan.net/article/1790246055514738690/9533cfe6002c80c400925bbb1ca75a2a.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/e3cdb3ef0bf5cc673fa39b26b42c6f46.webp)
多窗口切换
![](https://file.jishuzhan.net/article/1790246055514738690/b1704981da8ad202bf7b55f47b0b604a.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/f08017351ccec2ee2727e6dd44a8d2e8.webp)
窗口截屏
![](https://file.jishuzhan.net/article/1790246055514738690/d5f95b05ca65cbc5d024894af7645818.webp)
获取cooke来通过验证码
![](https://file.jishuzhan.net/article/1790246055514738690/96ac581ca0e5c1f32ed71e488458a1f5.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/91daeb37d33d2f7b35b656233cd991f6.webp)
自动化测试- unitTest框架
![](https://file.jishuzhan.net/article/1790246055514738690/d45f7c69cca2633efcb2a0fb8131b9c6.webp)
TestCase
pythonimport unittest #核心要素一 # 待测试的函数 def add(x,y): return x+y # 定义测试类 并继承来达成使用的目的(python中使用括号加.的方式来继承) class Test01(unittest.TestCase):# 将光标定在类上,就可以执行这个类下面的函数 def test_add(self): # 光标定在方法上,点击运行,只会执行一个函数 # 要调用的函数 print("结果",add(1,2)) def test_add12(self): # 要调用的函数 print("结果",add(11,2)) def ttttt(self):# 名称不是test开头不会运行 print("aaa") if __name__ == '__main__': # 这样没有用,if的条件不通过 __name__中,如果运行的模块是主模块, # 那么打印__mian__,不是则存放启动模块的值 # 在测试方法test中打印------name------的值会发现出现的是启动模块(文件)的值 unittest.main()
- 运行是将该类交给TestCase来运行,
TestSuite
![](https://file.jishuzhan.net/article/1790246055514738690/a131c829f85cbe4a39b0997ecb1a6bbf.webp)
TestLoader
![](https://file.jishuzhan.net/article/1790246055514738690/6cdc879c166a72ace2b12f2f5ca7f467.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/0dfa912b5dced1333c4ccc597d948411.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/81bf177d026d6ac26de1e7cae0ae60c2.webp)
TextTestRunner
![](https://file.jishuzhan.net/article/1790246055514738690/23b7fe512c995b5dab08fde98aa70acf.webp)
Fixture
![](https://file.jishuzhan.net/article/1790246055514738690/3528f3ffb4d18001f9dcc032b70a8b61.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/ca7aa5af6e3c56450fd8117aa2867d66.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/d6d6b577436b6809b572da734d2d5acf.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/5058f70c819f735aa824fc450de3ae0c.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/cae74cacdda6b59147f167bb1f5ef360.webp)
- 使用setupclass需要加上@classmethod注解
使用
@classmethod
装饰器将setUpClass
标识为类方法,它的第一个参数通常被命名为cls
,并允许你访问和操作类级别的资源,类方法需要该装饰器
![](https://file.jishuzhan.net/article/1790246055514738690/3d2741237aa11201b1f8420cd87738fa.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/499ee0d6977bf0cec95d7b8f23a213cc.webp)
箭头
-> None
不是Python函数定义的一部分,而是类型注释(type hinting)的一部分。它表示函数的返回类型。在这种情况下,-> None
意味着该函数没有返回值,即返回的是None
。在Python中,函数的返回类型通常不需要显式声明,因为Python是一种动态类型语言,函数可以返回各种不同类型的值。然而,类型注释是一种提供额外信息以帮助代码阅读和静态代码分析的机制。在类型注释中,
-> None
表示函数的返回值是None
,即没有返回值。
数据断言
![](https://file.jishuzhan.net/article/1790246055514738690/c39e8c3378bd3d08f9d880ef5aae0a61.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/ae313ce567db44cd056fe5cc89aac4c3.webp)
断言方法 | 参数要求 | 作用 |
---|---|---|
assertEqual(a, b) |
a 和 b 需要是可比较的,通常是相同类型。 | 检查 a 和 b 是否相等。 |
assertNotEqual(a, b) |
a 和 b 同样需要是可比较的,通常是相同类型。 | 检查 a 和 b 是否不相等。 |
assertTrue(x) |
x 应该是一个布尔值(True 或 False)。 | 检查 x 是否为 True。 |
assertFalse(x) |
x 应该是一个布尔值(True 或 False)。 | 检查 x 是否为 False。 |
assertIs(a, b) |
a 和 b 应该是对象,用于检查对象的身份。 | 检查 a 和 b 是否是相同的对象(身份相同)。 |
assertIsNot(a, b) |
a 和 b 应该是对象,用于检查对象的身份。 | 检查 a 和 b 是否不是相同的对象(身份不同)。 |
assertIn(a, b) |
a 和 b 可以是可迭代的对象,其中 a 是 b 的一个元素。 | 检查 a 是否在 b 中存在。 |
assertNotIn(a, b) |
a 和 b 可以是可迭代的对象,其中 a 不是 b 的一个元素。 | 检查 a 是否不在 b 中存在。 |
assertIsNone(x) |
x 可以是任何对象,用于检查它是否为 None。 | 检查 x 是否为 None。 |
assertIsNotNone(x) |
x 可以是任何对象,用于检查它是否不为 None。 | 检查 x 是否不为 None。 |
可迭代对象是指能够被迭代遍历的数据结构,通常是包含多个元素的集合。在Python中,许多数据类型都是可迭代的,包括但不限于:
- 列表(List):有序的元素集合,可以按照索引访问。
- 元组(Tuple):类似于列表,但是不可变的。
- 字符串(String):由字符组成的有序序列。
- 集合(Set):无序的元素集合,不包含重复元素。
- 字典(Dictionary):包含键-值对的集合,可以按键访问值。
- 范围(Range):表示一系列连续的整数。
- 文件对象(File Object):可以逐行读取文件内容。
- 迭代器(Iterator):自定义的可迭代对象,通过实现
__iter__()
和__next__()
方法来支持迭代。
![](https://file.jishuzhan.net/article/1790246055514738690/aa51a665475769c1b5c07a74374d4264.webp)
- 数据断言不返回结果,想要使用变量接收只能获得none
![](https://file.jishuzhan.net/article/1790246055514738690/431147afefe01ce027b3bc2e9106cba5.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/ba13f46bcd6b9e75574531a221773c36.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/37fca3c27eaa97754e196ce0fffa954c.webp)
- assetIn方法要求左边是被判断的元素
生成测试报告
![](https://file.jishuzhan.net/article/1790246055514738690/e08200f1f7c233e574ecb762198bcbaa.webp)
python
import unittest
import time
from HTMLTestRunner import HTMLTestRunner
suite = unittest.defaultTestLoader.discover("../case", pattern="test*.py")
if __name__ == '__main__':
# 测试报告存放位置
reportDir = '../case/test_report'
now = time.strftime("%Y-%m-%d-%H-%M-%S")
report_name = reportDir + '/' + now + 'result.html'
with open(report_name, 'wb') as f: # 更改为 'wb' 模式
runner = HTMLTestRunner(stream=f, title="标题", description="小标题")
runner.run(suite)
f.close()
- 该代码所使用的HTMLTestRunner不是原生的,而是经过美化的
- 学习测试报告的前置条件是知道python中的 with 语句
文本文件(txt等)使用w模式
图片文件使用wb模式
CSV文件使用a模式追加写
HTML/XML文件使用w模式
测试报告使用wb模式写入图片数据
with语句的主要特点和作用如下:自动调用对象的__enter__()和__exit__()方法进行资源获取和释放操作。
可以保证在代码块执行前后正确地打开和关闭资源,不用担心忘记关闭资源导致问题。
as关键字在with语句中的作用和含义是:
- 将文件对象或其他对象赋值给一个变量,以便后续使用。
- 相当于给文件对象或其他对象起一个"别名"
wb和w模式打开文件有以下区别:
- w模式:
以文本写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。
这样写入的传输的是bytes
- wb模式:
以二进制写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。
这样写入传输的是str
主要区别在于:
- w模式打开文件时采用文本模式,会对换行符等字符做转换。适用于文本文件。
- wb模式打开文件时采用二进制模式,不会对任何字符做转换。数据以原始二进制形式写入。适用于图片、视频等二进制文件。
发送邮件
![](https://file.jishuzhan.net/article/1790246055514738690/25c5d05e03f8a76ec115808a644196fb.webp)
PageObject模式与思想
![](https://file.jishuzhan.net/article/1790246055514738690/de2ecc4bfa2d093b292a23eeeeb33a71.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/d549e65d67926b9da5848db6009d5cb4.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/7a4e4d6748b778cee8a86eaabd26fdfc.webp)
雏形
![](https://file.jishuzhan.net/article/1790246055514738690/c7824719958dc5d7836f890616500c2c.webp)
- 将定位元素的值视作属性,将一个页面看作对象(一个类文件)
- 页面对象必须写在path文件夹中
- 最后将所有模块内容组合起来
![](https://file.jishuzhan.net/article/1790246055514738690/6e0c280ab96de6974edbd67278244b90.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/c2e869e78f2096fe8b8ad16a8b126091.webp)
- 将整个测试流程分层两个模块,Page模块负责页面的操作,而不进行测试
- scripts负责测试
最终版本
- 添加了基类
![](https://file.jishuzhan.net/article/1790246055514738690/2298d5e6e71704fcbfe425389667a13a.webp)
- 项目结构为基类层,页面层,脚本层
![](https://file.jishuzhan.net/article/1790246055514738690/896f9ee260b12eead7d2e7f9d0a11650.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/d95285f4bad4a48ac538aceb6674246f.webp)
- 小括号表示元组
![](https://file.jishuzhan.net/article/1790246055514738690/98ba7a5cdc7b77dcb508a3edeefe2289.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/d36f3106e78491fe7300cdde645c7462.webp)
- 不写小括号也可以
- 解包后,可以被selenium识别到
![](https://file.jishuzhan.net/article/1790246055514738690/fbe395d5e1ef58f1e33bce13daec6806.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/4014471ee568f34a7d678e4e6596bb24.webp)
- 如果要在参数中就解码,那就需要所有用到的地方都使用*
大bug
![](https://file.jishuzhan.net/article/1790246055514738690/4b0b521fddd55057abac3fd684e8c844.webp)
- 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类
![](https://file.jishuzhan.net/article/1790246055514738690/062ffead0b50c7265113fdf28976c9b7.webp)
![](https://file.jishuzhan.net/article/1790246055514738690/af9fc7bcdc3723a3faa62c42dd24a225.webp)
- 该bug是个复合bug先数据的拆包没有成功
![](https://file.jishuzhan.net/article/1790246055514738690/1313fd1701469ae9d018aa63a4cb80ac.webp)
- 模块需要封装成类方法
dJydHhYx-1715083072843)]
[外链图片转存中...(img-s8fyLE1T-1715083072844)]
- 如果要在参数中就解码,那就需要所有用到的地方都使用*
大bug
[外链图片转存中...(img-bOl9BqsR-1715083072844)]
- 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类
[外链图片转存中...(img-FNUg34qz-1715083072845)]
[外链图片转存中...(img-FAhvZlZf-1715083072846)]
- 该bug是个复合bug先数据的拆包没有成功
[外链图片转存中...(img-Ul3kdNmm-1715083072847)]
- 模块需要封装成类方法