Python自动化测试笔记

自动化入门

软件测试六大模块

  1. 功能性测试

  2. 可用性测试(用户体验)
    手机应用程序运行太慢
    删除数据无二次确认
    页面布局不美观
    网站经常出现弹窗广告
    页面字体颜色刺眼,字体太小
    网页上的超链接显示不明显

  3. 性能测试(高并发)
    网页长时间打不开,反应很慢
    应用程序运行太久占用内存很大
    系统运行不流畅
    高并发时系统崩溃

  4. 安全性测试(系统漏洞)
    经常接收到骚扰电话
    WIFI万能钥匙
    银行账户余额被恶意转走
    网站首页被恶意篡改
    手机上联系人信息被窃取
    网站被大量用户非法攻击

  5. 兼容性测试(客户端兼容性)技术性要求不高,操作繁琐
    某网页IE和firefox上显示效果不一样
    中国插座在欧美无法使用
    APP应用程序在某台设备上无法安装
    某应用程序在win10上经常卡顿

  6. 可靠性测试**(系统是否稳定,容错性,捕获异常的能力)
    测试流程——计划、分析、设计、实施(执行)、报告总结

自动化测试价值

概念:自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程

自动化测试的优势
提高测试执行效率,节约时间成本
解放人力去做更加重要的工作
可重复利用,减少对人的依赖
提高用户满意度
提升软件团队的水平
可大幅减少兼容性测试的工作量
有些测试工作必须依靠自动化来完成

自动化测试的不足
开发自动化测试脚本需要花费较长的周期
随产品的不断迭代,自动化测试脚本也将不断迭代,时间成本高
不同的项目间自动化测试脚本的重用度低(接口测试)
对于短期项目产品实施自动化价值不高
自动化测试无法代替手工测试找到产品的BUG
自动化测试开发过程对软件测试团队的技术有较高要求

测试的核心价值在于测试的分析与设计,手工自动化只是执行手段

自动化测试可行性

产品架构与业务可行性
单机应用程序,重点考虑界面级自动化测试
分布式应用系统,重点考虑接口级与界面级结合的自动化测试
手机APP应用,重点考虑接口级与界面级结合的自动化测试,重点关注兼容性
复杂业务场景,重点考虑接口级或代码级自动化测试,界面级测试可不作重点关注。且摘取使用频率最高的模块进行测试
简单业务场景,可考虑不进行或只进行界面级自动化测试

测试技术实现可行性

自动化测试可应用于界面级、接口级、代码级
不同的被测产品应根据不同的情况进行有针对性的技术选择
自动化测试技术并不难,重点是测试方案的定制
通用优先技术选择顺序,接口级>界面级>代码级
自动化测试工具选择面广,但没有一款工具可以完全满足企业需求,所以对自动化测试技术底层实现原理的理解和应用要优先于对工具的考虑选型

自动化测试更多用于回归测试或兼容测试,不能以寻找bug为目的
80%的企业自动化测试实施工作无法坚持,效果不理想,主要针对于页面,页面设计改动过于频繁。

什么样的项目适合做自动化测试
满足任一项就可以做

  1. 需求变动不频繁的(理想)
  2. 项目周期较长
  3. 自动化脚本可以重复使用

自动化测试使用场景:

  • 适用于兼容性测试
  • 适用于回归测试
  • 在迭代项目中对老功能使用自动化
  • 适用于冒烟测试(理论)

自动化测试常用工具

代码级自动化常用测试工具

xUnit;JUnit;CppUnit;NUnit;PyUnit…
XMock;JMock;NMock;——-桩
桩:假设与其交互部分已经完成
功能:断言、参数化、测试用例管理、Mock-桩,TDD–测试驱动开发,BDD–用户驱动开发

接口级自动化常用测试工具

LoadRunner(惠普、收费) —— 支持全协议 ,重点支持HTTP
SOAPUI —— 支持webservice协议SOAP
webLoad —— 支持HTTP协议
RPT(IBM)——重点支持HTTP和TCP/UDP协议
JMeter(Apache)——支持HTTP和JMS协议
浏览器插件postman,RESTClient——支持HTTP

界面级自动化常用测试工具

selenium:支持web应用,多语言多浏览器
APPium:Android,IOS移动应用
QTP/UFT:支持Windows,web,java,.NET应用程序
RFT:支持Windows,web,java,.NET应用程序
robot framework:关键字驱动自动化测试工具

主流测试工具汇总

web自动化测试:selenium、robot、framework
App端自动化测试:Appium、Monkeyrunner、UIautomation
PC客户端(win32)自动化测试:QTP
接口自动化测试:Jmeter、postman、httpUnit、RESTClient
云测试平台:Testin Testbird
性能测试:Jmeter、LoadRunner

主流自动化测试框架有哪些:

  1. web网页自动化:selenium + 编程语言 + 测试框架
  2. app自动化:appium + 编程语言 + 测试框架
  3. 接口自动化 :编程语言 + http库 + 测试框架
  4. web网页/ app/接口自动化 :RobotFramework

web自动化测试

1.web网页
2.在游览器中访问网页
3.通过浏览器与web网页进行交互(操作页面,输入输出)
目标:让代码代替人工完成与互联网浏览器的交互

web自动化-环境安装

  1. 安装浏览器-Google,firefox,IE…
  2. 安装浏览器驱动-chromedriver.exe、geckodriver.exeps
    注意:浏览器与该浏览器驱动的版本必须匹配一致
    注意:浏览器必须自己完成安装,不能从其他地方获取文件夹或链接,虽然同样可以打开浏览器,但在程序中与浏览器驱动配合时会报错!!!!!!!!
    注意:将下载好的浏览器驱动解压后,将xx.exe文件放置在python安装路径的根目录下
  3. 安装selenium框架(提供了与web网页交互的一组组件)Selenium WebDriver
    框架:提供了完成某项任务的元组件,通过挑选选用完成相应的系统

selenium webdriver 工作原理

  1. python + selenium 代码给浏览器驱动dirver.exe发送执行代码命令
  2. 浏览器驱动dirver.exe接收到命令后,驱动浏览器页面进行相应的操作
  3. 操作完成后,返回操作的结果

selenium 教程

一.selenium操作步骤

基本格式

二.selenium屏蔽谷歌浏览器信息提示栏

三.谷歌浏览器模拟移动端

四.浏览器操作

浏览器窗口大小设置

浏览器页面前进后退

浏览器页面关闭与刷新

五.元素定位

浏览器开发者工具(F12)

开发者工具

  • Element:做页面自动化时查找元素
  • Console:做手工测试时使用,控制台返回代码运行的结果
  • Network:做项目测试时使用,显示当前页面所有请求的接口

什么是元素定位

元素定位就是查找HTML元素的功能
通常使用find_element或find_elements方法定位元素
find_element 使用给定的方法定位查找一个元素
find_elements 使用给定的方法定位查找所有元素,返回一个列表list

元素定位常用方法

html页面中,id是唯一的,name和class是可以重复的

1.元素定位——id(唯一)

当定位的元素具有id属性时可以通过by_id的方式来定位元素

2.元素定位——name、class(重复)
3.元素定位——tag_name(重复)

通过元素的标签名查找元素

4.元素定位——by_link_text / by_partial_link_text

by_link_text通过超文本链接上的文字信息定位元素

5.元素定位——xpath

当常用的方法都无法对元素进行定位时,使用xpath系列定位方法

层级定位:通过其上一级的属性定位该元素

6.元素定位——通过xpath+索引

当一个父标签有多个相同的子标签时
//父标签[@父标签的属性名=“父标签的属性值”]/子标签名[索引值]
xpath的索引是从1开始的
如果定位的是父标签下的第一个子标签可以不加索引值

xpath逻辑关系 and(只用and)/or/not
当元素属性与其他元素属性有相同部分的时候,不能只利用一个属性定位,需要多个元素属性来进行定位:——and
//标签名[@属性名=“属性值” and @属性名=“属性值”]
//input[@name=“user” and @class=“login-test”]

模糊匹配
contains
//标签名[contains(@属性名,属性值或部分属性值)]

7.CSS选择器定位

by_css_selector通过css选择器查找元素。selenium官网的document中极力推荐使用CSS locator ,而不是xpath定位元素。原因是CSS locator比xpath locator速度更快,特别是在IE下比xpath更高效更准确容易编写,对各种浏览器的支持也很好。

css中 di、class属性
#表示id属性
.表示class属性
其他属性——标签属性
1)标签名[属性名=属性值]

2)层级定位
父标签名[父标签属性名=父标签属性值]>子标签 或 父标签名[父标签属性名=父标签属性值] 子标签

3)索引定位
#定位子标签
父标签[父属性名=父属性值]>:nth-child(所有子标签的个数索引值) # 索引从1开始
#定位下一级标签
父标签[父属性名=父属性值]>子标签名:nth-of-type(索引值)

4)逻辑定位
标签名[属性名1=属性值1][属性值2=属性值2]

5)css模糊匹配

六.元素基本操作

元素常用操作方法

  • 元素.clear() 清除文本
  • 元素.send_keys() 模拟输入 先清空后输入
  • 元素.click() 单击元素 按钮/链接/单、复选框。。。
  • 元素.size 返回元素大小
  • 元素.text 获取元素文本
  • 元素.title 获取页面title
  • current_url 获取当前页面url
  • 元素.get_attribute(“属性名”) “获取属性值xxx 要获取的属性 获取对应属性名的值”
  • 元素.is_displayed() 判断元素是否可见 返回True或False
  • 元素.s_enabled() 判断元素是否可用

七.常用操作API

1.鼠标事件
有关鼠标的操作包含在ActionChains类中。
ActionChains类鼠标操作的常用方法:
context_click() ——右击
double_click() ——双击
drag_and_drop(起始元素,终止元素) ——拖动
move_to_element(需要悬停操作的元素) ——鼠标悬停在一个元素上
click_and_hold() —— 按下鼠标左键在一个元素上
perform() —— 执行事件操作 操作后必须加perform()才会执行

2.键盘事件
Keys类提供键盘上所有按键的操作,可以模拟一些组合键的操作ctrl+v/ctrl+A

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
send_keys(Keys.F1) 键盘F1键

语法
元素.send_keys(Keys.键名) # 键名必须大写——单个键使用
元素.send_keys(Keys.CONTROL, “c”) # 组合键使用

3.下拉菜单——二次定位
先定位主元素,然后再定位主元素中的子元素

下拉菜单——使用Select类处理下拉菜单(推荐)

滚动条操作——javascript
1.设置javascript脚本控制滚动条 js = “window.scrollTo(0, 1000)” 水平距离 垂直距离 (像素)
2.webdriver调用js脚本方法 driver.execute_script(js)

滑动滚动条聚焦到元素的位置

frameset不用切,frame需层层切!
很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼(原因之一,改天专门说说定位不到元素,可能的一些原因及处理办法)。

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

1.怎么切到frame中(switch_to.frame())
selenium提供了switch_to.frame()方法来切换frame

switch_to.frame(reference)
不得不提到switch_to_frame(),很多人在这样写的时候会发现,这句话被划上了删除线,原因是这个方法已经out了,之后很有可能会不支持,建议的写法是switch_to.frame()

reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象,假设有如下HTML代码 index.html:

FrameTest 想要定位其中的iframe并切进去,可以通过如下代码:

from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0

driver.switch_to.frame(“frame1”) 2.用id来定位
driver.switch_to.frame(“myframe”) 3.用name来定位

driver.switch_to.frame(driver.find_element_by_tag_name(“iframe”)) # 4.用WebElement对象来定位
通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:

index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象
举个栗子:

1 用xpath定位,传入WebElement对象:

driver.switch_to.frame(driver.find_element_by_xpath(“//iframe[contains(@src,‘myframe’)]”))
1
2.从frame中切回主文档(switch_to.default_content())
切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

driver.switch_to.default_content()
1
3.嵌套frame的操作(switch_to.parent_frame())
有时候我们会遇到嵌套的frame,如下:

1.从主文档切到frame2,一层层切进去

driver.switch_to.frame(“frame1”)
driver.switch_to.frame(“frame2”)

2.从frame2再切回frame1,这里selenium给我们提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。

driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果

有了parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame,随意的跳来跳去了。

所以只要善用以下三个方法,遇到frame分分钟搞定:

driver.switch_to.frame(reference)
driver.switch_to.parent_frame()
driver.switch_to.default_content()

4.多窗口切换
在页面操作时有时会点击某个链接弹出新的窗口,这时候就需要切换到新打开的窗口上进行操作。
switch_to.window()方法可以实现不同的窗口之间切换。

current_window_handle 获取当前窗口句柄
window_handles 获取所有窗口句柄(列表)
switch_to.window() 切换窗口

来源:yu506591069

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年6月3日
下一篇 2020年6月3日

相关推荐