目录
第一章 Web自动化入门
1. 认识自动化及自动化测试
2. 自动化测试工具选择
3. 环境搭建
通过pycharm安装
科普path
# 导包
from time import sleep
from selenium import webdriver
# 获取浏览器驱动
driver = webdriver.Chrome()
# 打开百度网页
driver.get('http://www.baidu.com')
# 暂停三秒
sleep(3)
# 关闭浏览器驱动
driver.quit()
第二章 Selenium-API操作(重点)
1. 元素定位方式(八大:id,name.class_name,tag_name,link_text,partial_link_text,XPath,CSS)
定位方式
1. id定位
案例(打开百度,在输入框中输入元素定位后暂停三秒退出)
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
# 获取浏览器驱动
driver = webdriver.Chrome()
# 打开百度网页
driver.get('http://www.baidu.com')
# 定位搜索框元素并输入“元素定位”
element = driver.find_element(By.ID, "kw").send_keys("元素定位")
# 暂停三秒
sleep(3)
# 关闭浏览器驱动
driver.quit()
1714100790906
2. name定位
4. class_name定位
5.tag_name定位(不常用)
- link_text和partial_link_text(模糊)定位
6.XPath定位
· XPath介绍
· XPath定位策略(方式)
· XPath延申
7.CSS定位
· CSS介绍
· CSS定位策略(方式)
· XPath延申
XPath和CSS区别
2. 元素和浏览器的操作方法
元素操作(案例)
- 打开百度网页
- 点击登录按钮,打开登录页面
- 输入手机号/用户名/邮箱,输入密码
- 勾选同意协议,点击登录
- 清除手机号/用户名/邮箱,重新输入手机号/用户名/邮箱
- 关闭浏览器驱动
from time import sleep
from selenium import webdriver
# 获取浏览器驱动
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 打开百度网页
url = 'http://www.baidu.com'
driver.get(url)
# 点击登录按钮打开登录页面
driver.find_element(By.LINK_TEXT,'登录').click()
sleep(1)
# 输入手机号/用户名/邮箱
driver.find_element(By.CSS_SELECTOR, 'input[placeholder="手机号/用户名/邮箱"]').send_keys('15513962114')
sleep(1)
# 输入密码
driver.find_element(By.CSS_SELECTOR,'input[placeholder="密码"]').send_keys('WHNXLX')
sleep(1)
# 勾选同意协议
driver.find_element(By.ID,'TANGRAM__PSP_11__isAgree').click()
sleep(1)
# 点击登录
driver.find_element(By.ID,'TANGRAM__PSP_11__submit').click()
sleep(2)
# 清除手机号/用户名/邮箱
driver.find_element(By.CSS_SELECTOR, 'input[placeholder="手机号/用户名/邮箱"]').clear()
sleep(1)
# 重新输入手机号/用户名/邮箱
driver.find_element(By.CSS_SELECTOR, 'input[placeholder="手机号/用户名/邮箱"]').send_keys('13534762114')
sleep(2)
# 关闭浏览器驱动
driver.quit()
QQ录屏20240430165601
浏览器常用API
案例
- 获取浏览器驱动
- 打开百度网页
- 改变位置,改变大小,最大化浏览器
- 点击壁纸,点击知道,回退,前进
- 关闭浏览器驱动
from time import sleep
from selenium import webdriver
# 获取浏览器驱动
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 打开百度网页
url = 'https://image.baidu.com/'
driver.get(url)
sleep(1)
# 改变位置
driver.set_window_size(200,300)
sleep(1)
# 改变大小
driver.set_window_position(200,300)
sleep(1)
# 最大化浏览器
driver.maximize_window()
sleep(1)
# 点击壁纸
driver.find_element(By.PARTIAL_LINK_TEXT,'壁纸').click()
sleep(1)
# 点击知道
driver.find_element(By.PARTIAL_LINK_TEXT,'知道').click()
sleep(1)
# 回退
driver.back()
# 前进
driver.forward()
# 关闭浏览器驱动
driver.quit()
QQ录屏20240430210618
获取元素信息常用API
3. 鼠标和键盘操作
> 鼠标操作
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 打开百度网页
url = 'https://baidu.com/'
driver.get(url)
sleep(1)
# 最大化浏览器
driver.maximize_window()
sleep(1)
# 实例化并获取ActionChains
active = ActionChains(driver)
# 右击
active.context_click().perform()
sleep(1)
# 双击
active.context_click(driver.find_element(By.ID,'form')).perform()
sleep(1)
#悬停
active.move_to_element(driver.find_element(By.CSS_SELECTOR,'span[name="tj_settingicon"]')).perform()
sleep(1)
driver.close()
# 关闭浏览器驱动
#driver.quit()
> 键盘操作
4.元素等待(重点:显示等待)
5.下拉选择框
> CSS定位
> Select选择框
6.弹出框
7.滚动条操作
8.frame表单操作(重要)
9.多窗口切换(重要)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
# 打开新浪网页
url = 'https://www.sina.com.cn/'
driver.get(url)
# 最大化浏览器
driver.maximize_window()
sleep(1)
# 隐式等待
#driver.implicitly_wait(5)
# 获取当前页面句柄
current_handle = driver.current_window_handle
# 点击切换女性页面
driver.find_element(By.PARTIAL_LINK_TEXT,'女性').click()
sleep(2)
# 获取所有页面句柄
handles = driver.window_handles
for h in handles:
# 判断是否为当前页面句柄,不是则切换
if h != current_handle:
# 切换
driver.switch_to.window(h)
driver.find_element(By.PARTIAL_LINK_TEXT, '护肤').click()
sleep(2)
driver.close()
# 关闭浏览器驱动
driver.quit()
10.窗口截图( 失败截图)
11.验证码处理
第三章 UnitTest框架
1. UnitTest基本使用
> 基本要素
> 切换测试框架
1.1 TestCase
# UniTest框架——TestCase
# 1 导包
import unittest
# 2 编写求和函数
def add(x, y):
return x + y
# 3 定义测试类并继承
class Test_01(unittest.TestCase):
# 4 定义测试方法(注意以test开头)
def test01(self):
result = add(1, 2)
print("结果为:",result)
def test02(self):
result = add(2, 2)
print("结果为:",result)
结果:
1.2 TestSuite 和 TextTestRunner
# UniTest框架——TestSuite
# 1 导包
import unittest
from testcase import Test_01
# 2 实例化对象获取TestSuite对象
suite = unittest.TestSuite()
# 3.a调用ddTest添加测试用例
# 方法1 类名(“方法名”)
# suite.addTest(Test_01("test01"))
# suite.addTest(Test_01("test02"))
# 方法2 unittest.makeSuite(类名)
suite.addTest(unittest.makeSuite(Test_01))
# 执行测试套件
runner = unittest.TextTestRunner()
runner.run(suite)
1.3 TestLoader(只用这个基本)
# UniTest框架—— TestLoader
# 1 导包
import unittest
from testcase import Test_01
# 2 调用TestLoader下的discover方法
suite = unittest.TestLoader().discover("./", pattern='test*.py')
# 3 执行测试套件
runner = unittest.TextTestRunner()
runner.run(suite)
结果:
2.Fixture(装置)
# UniTest框架——Fixture
import unittest
# 3 模块级别
def setUpModule():
print("setUpModule")
def tearDownModule():
print("tearDownModule")
class Test_02(unittest.TestCase):
# 2 类级别
@classmethod
def setUpClass(cls):
print("开始类级别")
@classmethod
def tearDownClass(cls):
print("结束类级别")
# 1 函数级别
def setUp(self):
print("开始")
def tearDown(self):
print("结束")
def test01(self):
print("test01")
def test02(self):
print("test02")
结果:
3. UnitTest断言
> 练习
import time
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestCase(unittest.TestCase):
# >定义初始化方法
def setUp(self) -> None:
# 获取驱动
self.driver = webdriver.Chrome()
# 打开浏览器
url = "https://www.baidu.com"
self.driver.get(url)
sleep(1)
# 最大化页面
self.driver.maximize_window()
# 隐式等待
self.driver.implicitly_wait(3)
pass
def tearDown(self) -> None:
sleep(2)
self.driver.quit()
pass
def test_login(self):
self.driver.find_element(By.PARTIAL_LINK_TEXT,'登录').click()
self.driver.find_element(By.ID,'TANGRAM__PSP_11__userName').send_keys('13592554912')
self.driver.find_element(By.NAME,'isAgree').click()
self.driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
sleep(1)
result = self.driver.find_element(By.ID,'TANGRAM__PSP_11__error').text
print("结果为:", result)
# 预期结果
except_result = "请您输入密码"
# 断言
try:
self.assertEqual(result,except_result)
except AssertionError:
self.driver.get_screenshot_as_file("./image/{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))
# 捕获异常
raise
成功通过结果:
失败结果为:
重点
断言拓展——python自带断言![](https://img-blog.csdnimg.cn/direct/ae637f99034d4eccb32269dfed8f48bd.png)
4. 参数化
> 下载包
> 案例
'''
步骤:
1.导包from parameterized import parameterized
2.修饰测试函数@parmeterized.expand(列表类型数据)
3.在测试函数中使用变量接收,传递过来的值。
语法:
1.单个参数:值为列表
2.多参数:值为列表嵌套元组如:[(1,2,3),(2,3,4)]
'''
import unittest
from parameterized import parameterized
class TestCase(unittest.TestCase):
# # 单个参数
# @parameterized.expand([1,2,3])
# def test_01(self,num):
# print(num)
# # 多个参数
# @parameterized.expand([(1,2,3),(2,3,5)])
# def test_01(self, a,b,c):
# print("{}+{}={}".format(a,b,c))
# data = [(1, 2, 3), (2, 3, 5)]
# @parameterized.expand(data)
# def test_01(self, a,b,c):
# print("{}+{}={}".format(a,b,c))
def get_data(self):
return [(1, 2, 3), (2, 3, 5)]
@parameterized.expand(get_data(True))
def test_01(self, a, b, c):
print("{}+{}={}".format(a, b, c))
结果:
import unittest
from parameterized import parameterized
def addtest(a, b):
return a+b
def get_data():
return [(1,2,3),(2,3,5)]
class TestCase(unittest.TestCase):
@parameterized.expand(get_data())
def test_01(self,a,b,except_result):
# 断言
assert addtest(a,b) == except_result
结果:
5.unittest跳过方式
6.生成HTML测试报告
'''
目标:基于单元测试框架执行生成HTML版报告操作:
1.复制HtmLTestRunner.py文件到指定目录
2.导包from HTMLTestRunner import HTMLTestRunner
3.获取报告存放文件流,并实例化HTIMLTestRunner类,执行run方法
'''
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
# 定义测试套件
suite = unittest.defaultTestLoader.discover("./",pattern='test*.py')
# 定义报告存放路径或文件名
report_dir = "./report/{}.html".format(time.strftime("%Y_%m_%d_%H_%M_%S"))
with open(report_dir,"wb") as f:
HTMLTestRunner(stream=f,title="test报告",description="操作系统windows10").run(suite)
with open
第四章 PO模式
1. V1
不能批量执行
# 导包
from time import sleep
from selenium import webdriver
# 获取driver对象
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
driver.get("https://www.baidu.com/")
# 点击登录
driver.find_element(By.LINK_TEXT,'登录').click()
sleep(1)
# 输入手机号/用户名/邮箱
driver.find_element(By.CSS_SELECTOR, 'input[placeholder="手机号/用户名/邮箱"]').send_keys('15513962114')
sleep(1)
# 输入密码
driver.find_element(By.CSS_SELECTOR,'input[placeholder="密码"]').send_keys('WHNXLX')
sleep(1)
# 勾选同意协议
driver.find_element(By.ID,'TANGRAM__PSP_11__isAgree').click()
sleep(1)
# 点击登录
driver.find_element(By.ID,'TANGRAM__PSP_11__submit').click()
sleep(2)
# 获取提示信息
msg = driver.find_element(By.CSS_SELECTOR,'[id="TANGRAM__PSP_11__error"]').text
print(msg)
# 断言
assert msg == '用户名或密码有误,请重新输入或找回密码'
# 关闭浏览器驱动
driver.quit()
driver.close()