2024-10-22软测学习之selenium学习笔记
文章目录
小记
一、自动化测试基本概念
自动化测试:利用一些工具或者编程语言,通过录制或者编程的方法,设定特定的测试场景,模拟用户业务使用流程,自动寻找缺陷
自动化测试优点:
- 对程序的回归测试更方便,提升回归效率,节约人力。
- 可以执行一些手工测试困难或不可能进行的测试。
- 更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来,投入更多精力设计更好的测试用例
- 测试具有可重复性。
- 增加软件信任度,由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。
自动化测试缺点:
6. 不能取代手工测试,工具本身并无想像力。
7. 对自动化测试人员要求较高。
8. 对被测试系统质量的依赖性极大,维护成本高。
9. 测试脚本本身也可能存在缺陷。
10. 编写的测试脚本工作量有时也很大,甚至会有超过手动测试的时间。
适合自动化测试的产品:
11. 软件需求变动不频繁。
12. 项目周期长,规划性强。
13. 回归测试任务重。
14. 项目进度压力不大。
Selenium Webdriver:
WebDriver用于操作浏览器,通过WebDriver设计的API来实现的。Webdriver是一套标准库,不依赖于任何测试框架,除了必要的浏览器驱动,不需要启动其他进程或安装其他程序。
webdriver下载地址:
Firefox:https://github.com/mozilla/geckodriver/releases
IE:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Chrome:https://sites.google.com/a/chromium.org/chromedriver/
其它驱动:http://www.seleniumhq.org/download/
webdriver安装:将插件放入python安装路径下(D:\Python\Python37)(Firefox版)
二、浏览器操作
get(url):打开指定页面
set_window_size(x,y) :设置窗口大小
maximize_window():放大浏览器为全屏模式
minimize_window() 最小化
forward():前进
back():后退
refresh():页面刷新
close() 关闭窗口
quit() 关闭浏览器
eg:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
driver=webdriver.Firefox()
driver.get("http://localhost:8080/")#get(url)
driver.set_window_size(x,y)#设置窗口大小
driver.maximize_window()#放大浏览器为全屏模式
driver.minimize_window()# 最小化
driver.forward()#前进
driver.back()#后退
driver.refresh()#页面刷新
driver.close()#关闭窗口
driver.quit()# 关闭浏览器
三、界面元素操作
click() :点击界面元素按钮
clear() :清除元素内容
send_keys(参数1,参数2,……) :发送文字,参数:字符串
submit():用于提交表单form、信息,相当于回车操作。
四、元素定位
语法:
find_element(定位方式, 值) 返回一个元素
find_elements(定位方式, 值) 返回一个列表
定位方式有:
id:find_element(‘id’, ‘值’) 通过id来查找元素
name: find_element(‘name’, ‘值’) 通过name来查找元素
class name:find_element(‘class name’, ‘值’) 通过类名查找元素
link text:find_element(‘link text’, ‘值’) 通过某个超链接的文本字符进行查询
partial link text:find_element(‘partial link text’, ‘值’) 通过部分文字链接定位
xpath:find_element(‘xpath’, ‘值’) 通过路径定位
css selector:find_element(‘css selector’, ‘值’) 通过选择器定位
tag name:find_element(‘tag name’, ‘值’) 通过标签名定位
from selenium import webdriver
driver=webdriver.Firefox()
driver.get(r'https://www.baidu.com/')
driver.finf_element('name','wd').send_keys('11')
driver.find_element('id','su').click()
xpath定位
路径:是xpath识别对象的一种方式,即设置测试对象在页面中的路径地址,然后通过该地址进行元素查找
xpath 是html的一种路径标记语言,目的是为了能标记并快速定位文件中的某个元素(标签)。
xpath的常用语法:
通过绝对路径定位元素(不推荐使用): find_element(‘xpath’,“/html/body/div/form/input”);
通过相对路径定位元素:
find_element(‘xpath’, “//div/input”);#选取所有的div下面的儿子input
find_element(‘xpath’,“//div//input”);#选取所有的div下面的后代input
使用索引定位元素:
find_elements(‘xpath’,“//input[4]”); #全页面查找,查找这个页面上第4个input
find_elements(‘xpath’,“//input”)[3]; #全页面查找所有的input,取第4个input
(find_elements 定位一组元素,返回列表)
使用xpath及属性值定位元素:
语法:xpath = “//标签名[@属性=‘属性值’]”
find_elements(‘xpath’, “//input[@id=‘kw’]”); # 全文查找id = kw的这个input标签
部分属性值匹配:
包含: //标签名[contains(@属性, ‘部分属性值’)]
以什么开头: //标签名[starts-with(@属性, ‘部分属性值’)]
find_elements(‘xpath’,“//[contains(@href, ‘news.baidu’)]“)
匹配包含属性的值 # 全文查找所有标签,href属性包含news.baidu的标签
find_elements(‘xpath’,”//[starts-with(@href,‘https’)]”)
匹配开始字段, # 全文查找所有标签,href属性以https开头的标签
ends - with方法不可用
Xpath定位方式的缺点:
由于xpath需要遍历页面,所以定位元素的性能要比其它的方式差
不够健壮,xpath会随着页面元素的改变而改变
兼容性不好,在不同的浏览器下对xpath的实现不一样
使用css定位:相较于xpath,使用css选择器定位写法更简洁。
五、获取界面元素内容
size:获取元素的尺寸
text:获取元素的文本
title:获取页面标题
current_url:获取当前url地址
get_attribute(属性名): 获取元素属性值
六、键盘操作
导入from selenium.webdriver.common.keys import Keys
一般send_keys函数联用,常见的方法:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(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)
七、鼠标操作
导入selenium.webdriver.common.action_chains
ActionChains 类中,常用的方法:
context_click() 右击
double_click() 双击
click_and_hold() 左击悬停
move_to_element() 鼠标悬停
drag_and_drop() 拖动
perform() 执行ActionChains中存储的行为
click() 单击(点击鼠标左键一次)
八、多窗口
在页面操作中点击链接有时会弹出一个新的浏览器窗口,这就涉及多窗口的切换操作。
current_window_handle 获取当前窗口handle
window_handles 获取所有窗口handle,得到一个列表
switch_to.window(句柄号) 切换窗口
WebDriver只能在一个页面上对元素识别与定位,如果跨Frame定位元素是无法直接定位的,必须先切换到该元素所在的Frame才能定位。
switch_to.frame() 切换到指定Frame,参数:定位到的Iframe元素
switch_to.parent_frame() 切换到上一层frame
switch_to.default_content() 跳到最外层frame
九、弹出框
对js(JavaScript)使用的alert、confirm 以及 prompt定位也是项目中常见的,比如弹出提示框“确定”等。要定位这类提示框具体思路是switch_to.alert方法定位alert/confirm/prompt,然后使用text/accept/dismiss/send_keys这一系列动作。
text # 获取alert文本内容
accept() # 等同于点击“确认”或“OK”
dismiss() # 等同于点击“取消”或“Cancel”
send_keys(keysToSend) # 发送文本,对有提交需求的prompt框
十、下拉框
常见下拉框操作包含在selenium.webdriver.support.select的Select 类中,常用的方法:
select_by_value(‘value’) 通过value值选择
select_by_visible_text(‘text’) 通过文本选择
select_by_index(index) 通过索引选择,索引从0开始
十一、等待
python提供sleep强行等待的方式。
sleep()
Selenium Webdriver 提供了两种类型的等待方法:隐式等待(implicit) 和 显示等待(explicit)。
隐式等待:在设定的时间t内等到页面上的元素加载完成。若在时间t内元素加载完成,则剩下的时间不需要再等待,若时间t外,元素还未被加载则系统报错。隐式等待是全局的,作用在整个脚本上,所以在一个脚本中只需要设置一次即可。
显式等待:在设定的时间内,按照固定的时间间隔扫描指定元素是否加载完成,加载完成则剩下的时间不再等待,代码继续往下执行,如果在时间t内没有加载完成则系统报错。
注意:隐式等待和显式等待都可以设置,等待的最长时间取两者之中的大者。
implicitly_wait(max_time) 隐式等待时间
WebDriverWait(driver, max_time, check_time).until(expected_conditions.presence_of_element_located(locator))
max_time最长等待时间,check_time每隔xx时间判断,locator判断的元素,元组
十二、文件上传
文件上传:普通的附件上传是将本地文件的路径作为一个值放在input 标签中,通过form 表单将这个值提交给服务器。可以通过send_keys(“文件路径”)直接上传。
十三、截图
一般在执行用例时,如果用例失败,需要将当前窗口截图保存
方法:get_screenshot_as_file(‘imgname’)
十四、unittest框架
- 基本概念 Unittest做单元测试,也可以完成Web自动化测试。 自动化测试用例的组织和管理 提供丰富的比较方法,完成结果的检查 提供执行过程数据,如:执行时间、执行结果等 Test Case:一个TestCase实例就是一个测试用例,即一个test开头的测试函数。 测试用例 Test Fixture:用于测试前的环境初始化和测试后的环境清理,通过setUp函数和tearDown函数完成。 测试夹具 测试手脚架 Test Runner:unittest单元测试框架提供了TextTestRunner类来运行多个Test Suite或test case。 测试运行器 Test Suite:一个功能测试需要很多Test Case,可以多个测试用例统一进行执行,把多个用例加到一个Test Suite中。 测试套件 测试集
- 断言方法 断言方法是unittest框架提供的一组方法,可以通过这些方法完成期望结果和实际结果的对比。 assert 要断言的语句,‘报错语句’ python提供 assertEqual(a,b,msg=None) 检查a==b,不等则报错 assertNotEqual(a,b,msg=None) 检查a!=b,相等则报错 assertIn(a,b,msg=None) 检查a in b,不在报错 assertNotIn(a,b,msg=None) 检查a not in b,在报错 assertTrue(a,msg=None) 检查表达式a成立,不成立报错 assertFalse(a,msg=None) 检查表达式a不成立,成立报错 assertIsInstance(obj,cls,msg=None) 检查obj是cls一个实例,是则pass,不是就报错 assertNotIsInstance(obj,cls,msg=None)检查obj不是cls一个实例,不是则pass,是则报错 assertIsNotNone(a,msg=‘提示信息’) assertIsNone(a,msg=‘提示信息’)
十五、测试用例管理
通过Test Suite测试集(测试套件)来组装单个测试用例,然后通过addTest方法加载
TestCase添加到TestSuite中。接着调用unittest框架的TextTestRunner( )类,通过
TextTestRunner对象调用Run()方法类运行suite中所组装的测试用例。
discover方法批量执行脚本用例。使用discover方法会自动收集指定目录下的测试用例添加到测试套件中,然后通过run()方法执行discover,大大简化了测试用例的查找和执行。
十六、Html测试报告
自动化测试执行完成以后,需要输出一个完整的测试报告,供测试人员查看测试执行情况,确认自动化测试执行发现的缺陷情况。
HTMLTestRunner是Python标准库的unittest单元测试框架的一个扩展,可以生成一个可读性很强的HTML格式的测试报告。
下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
下载HTMLTestRunner.py文件,然后将其复制到 D:\Python\Python37\Lib 下(以实际安装目录为准)
十七、模块化脚本
借鉴编程语言中模块化思想,把重复性操作独立成公共模块,使用到的时候直接调用公共模块即可,不用重复的编写,从而降低代码量、提高自动化测试脚本的可维护性。
模块化脚本优点:
提高了开发效率,降低重复性代码的编写。
简化了代码维护的复杂度和工作量。
代码清晰
十八、代码分层
模块后脚本存在问题:所有测试用例代码在一个文件中,如果测试模块多时测试脚本过大。
解决方法:
每个模块的测试用例代码单独放在一个文件中
新建一个测试运行文件,调用所有测试用例代码
改造后代码分为三层:执行文件、测试用例、页面
十九、数据驱动
模块化解决了测试代码重用性的问题,但是代码中测试的操作与测试数据耦合在一起的,一旦需要对大量不同的数据进行测试时,就需要重新编写大量的测试用例。
数据驱动是可以很好的解决这个问题,数据驱动可以将测试代码与测试数据很好的分离。测试数据存放在另外的文件中进行单独的维护,可以快速在增加相似的测试数据,完成在不同的数据下的测试。
- 数据储存在py文件中,使用全局变量
- 数据储存在txt文本中,使用变量赋值、字典、列表等相同形式
- 数据储存在csv文件中
- 数据储存在xls、xlsx文件中
二十、自动化测试框架
PO设计模式(Page Object Model)
Page Object为自动化测试项目开发的最佳设计模式之一,主要体现为对于页面细节的封装(以页面为单位进行管理),从而提高用例的可维护性。
优点:
减少代码的重复
提高测试用例的可读性
提高测试用例的可维护性,特别是UI频繁变化的项目
PO(PageObject)模式目录结构:
common:保存公共方法及公共配置
pages:保存页面类
data:保存测试数据(csv格式文件)
log:保存测试报告、用例失败时的截图
testcase:保存测试用例
run.py:程序主入口
readme:用于对项目进行说明
版权归原作者 请叫我知先生 所有, 如有侵权,请联系我们删除。