一、工具:
selenium
二、元素定位:
方式一:通过元素的id (一个id值是唯一的,只属于一个元素)
方式二:通过元素的class
方式三:通过元素的name
方式四:通过超链接文本by_link_text (是精确匹配,需要文本完全相同才能匹配)
方式五:通过超链接文本(模糊匹配)by_partial_link_text
方式六:通过元素标签tag_name
方式七:通过css选择器
方式八:xpath(万能,稳定,重点)
Xpath表达式:
xpath语法规则:
/ 根节点,节点分隔符, //任意位置
* 任意元素 @属性
. 当前节点 ..父级节点
text 文本值
格式:
属性://*[@属性='属性值']
文本值://*[text()='文本值']
高级查询:
contains模糊查询:contains(@属性/text(), 值)]
starts-with 匹配一个属性开始位置的关键字
三、浏览器常用基本操作
刷新页面: driver.refresh()
获取浏览器窗口大小:driver.get_window_size()
设置浏览器窗口大小:driver.set_window_size()
浏览器最大化窗口:driver.maximize_window()
浏览器全屏:driver.fullscreen_window()
获取浏览器窗口个数:driver.get_window_handle
len(driver.window_handles)
切换到指定窗口: 先获取窗口列表:all_window=driver.window_handles
切换窗口参数:切换到第几个,索引从0开始:driver.switch_to.window(all_window[1])
前进:driver.forward()
后退:driver.back()
关闭:driver.close() 关闭当前窗口
退出:driver.quit() 完全退出浏览器
关闭alert弹窗,confirm弹窗处理:driver.switch_to.alert.accept()
driver.save_screenshot(‘./test.png’)截图
四、web自动化测试常见报错分析
1、检查元素的定位是否写正确
2、页面元素进行获取的时候查看是否已经加载出来,(等待时间)
3、元素在页面上不可见,需要拖动下拉框或者放大窗口
4、页面元素在iframe标签里面
5.元素需要切换到新窗口
6.元素隐藏(js元素隐藏属性更改为可见)
五、切换frame
1.通过frame的名字
driver.switch_to.frame('frame_name')frame的名字
driver.switch_to.frame('login_frame')
2.通过索引
driver.switch_to.frame(1)索引从0开始
如何判断页面中有多个frame标签,并知道需要定位的frame标签是第几个?
答:可以在页面开发者工具中,CTRL+F 中输入//iframe,就可以显示所有iframe标签,切换标签后,
到哪个标签,目标位置显示蓝色,就是第几个。
3.通过webelement(元素定位的结果)
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="login_frame"]'))
4.通过id的值
driver.switch_to.frame('login_frame')
退出frame:如果在frame里面操作元素,再想回到主页面里面进行元素操作,就必须先退出当前的frame
driver.switch_to.default_content()
六、三种等待时间
1.强制等待
导入:from time import sleep
调用:sleep(3):强制等待3秒
2.隐式等待(implicitly_wait)
driver.implicitly_wait(10)
在10s时间内,页面加载完成,进行下一步操作
3.显式等待
导入:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
调用:
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,'//*[@rows="4"]')))
匿名函数:
WebDriverWait(driver,16).until(lambda x : x.find_element(By.XPATH,'//*[@rows="4"]')
七、键盘操作
所有的键盘操作都是通过 send_keys()里面通过改变参数实现的。
在使用键盘按键方法前需要先导入 keys 类包:
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.COMMAND) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘F1
send_keys(Keys.F5) 键盘F5
send_keys(Keys.F12) 键盘F12
八、鼠标操作
操作都包含在ActionChains 类中,所以要模拟鼠标操作是首先要导入ActionChains。
在使用鼠标操作前需要先导入ActionChains类包:
from selenium.webdriver.common.action_chains import ActionChains
对ActionChains类进行实例化对象操作,调用操作(元素)方法,再执行操作perform方法
九、unittest测试框架
import unittest
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner # 导入测试报告类
class Testcase(unittest.TestCase):
# 类夹具
@classmethod
def setUpClass(self) -> None:
self.driver = webdriver.Chrome() # 获取驱动,打开浏览器
# 方法夹具
def setUp(self) -> None:
self.driver.get('http://42.192.6.197/')
def tearDown(self) -> None:
self.driver.close()
def tearDownClass(self) -> None: # 关闭浏览器
self.driver.quit()
# 跳过测试用例
@unittest.skip('不想运行')
def test01(self): # 测试用例必须以test开头
self.driver.find_element_by_id('ws').send_keys('手机')
self.driver.find_element_by_id('seg').click()
@unittest.skipIf(3 > 2, '跳过')
def test02(self):
print("这是第二条测试用例")
# 断言
res = len(self.driver.find_elements_by_xpath(''))
self.assertEqual(res, 3)
'''运行所有用例'''
# 运行当前py文件内所有继承而来unittest.TestCase的类里面的测试用例
unittest.main()
'''运行部分用例'''
# 运行(多个py文件)一个类/多个类的部分测试用例
if __name__ == '__main__': # 快捷键:main回车,意义:放在if下面的代码,如果模块是被直接运行的,则代码块被运行,如果模块被import,则代码块不被运行。
# 创建测试套件
run_case = unittest.TestSuite()
# 向测试套件内添加测试用例[测试类名1(测试用例名称1),测试类名2(测试用例名称2)]
run_case.addTests([Testcase('test01'), Testcase('test02')])
# 添加测试执行器TextTestRunner,调用run方法,需要传参数为需要执行的测试套件
runner = unittest.TextTestRunner()
runner.run(run_case)
# 运行多个测试类(跨多个py文件)的测试用例
# 1.导入其他文件的类 from 文件名 import 类名
# 2.在测试套件内添加测试用例即可
'''运行(多个py文件)一个类/多个类的所有测试用例'''
# 创建测试套件
run_case = unittest.TestSuite()
# 向测试套件内添加测试用例,实例化unittest.TestLoader()对象,调用方法loadTestsFromTestCase(Testcase)
# 并传入参数类名,如果有多个类,需重复添加
run_case.addTests(unittest.TestLoader().loadTestsFromTestCase(Testcase))
'''测试报告selenium+unittest+HTMLTestRunner'''
if __name__ == '__main__':
run_case = unittest.TestSuite()
run_case.addTests([Testcase('test01'), Testcase('test02')])
# 1.定义报告路径。2.打开一个html文件,3.运行用例,测试结果写入到html文件
# 定义测试报告生成路径:
report_dir = './test_report.html'
file = open(report_dir,'wb')
# 通过HTMLTestRunner运行测试套件
runner = HTMLTestRunner(
title = '项目名称',
description = 'xx模块自动化测试用例报告',
stream=file
)
runner.run(run_case)