前言
软件测试需要掌握的基础知识
HTML基础
1.可以通过查看HTML元素相关信息,来确定前端是否存在问题
2.在使用web自动化的过程中,也需要查看HTML元素的
Linux基础
1.当前工作中,所有服务器以及应用的环境都是搭建在Linux服务器上的
2.测试过程中,出现问题需要去查看后台的日志信息,此时需要连接到Linux服务器上去进行日志查看
数据库
1.针对前端没有显示出来的字段,需要通过SQL去查询
2.通过接口增加的商品需要使用SQL查询来确认是否增加成功
手工测试
写用例,分析测试点,执行测试用例
python基础
1.实现自动化代码
2.通过python测试框架来管理测试用例
3.所用知识点:函数调用,类和类方法创建及调用
一.什么是自动化测试
即程序代替人工进行系统校验的过程
1.自动化测试能解决什么问题?
1.回归测试:针对之前旧的功能进行测试和针对上一个版本的问题进行回归
2.兼容性测试:web实例化不同的浏览器驱动相当于对不同的浏览器进行操作
3.性能测试:通过一些工具模拟多个用户实现并发操作
4.提高工作效率,保障产品质量
2.自动化测试的优点
1.自动化测试能在较少的时间内执行更多的测试用例
2.自动化测试能够减少人为的错误
3.自动化测试能够克服手工测试的局限性
4.自动化测试可以重复执行(如注册用户)
3.自动化测试的误区
1.自动化测试可以完全代替手工测试
2.自动化测试一定比手工测试厉害
3.自动化测试可以发现更多bug
4.自动化测试适用于所有的功能
4.自动化测试的分类
1.web自动化测试:web系统
2.移动app自动化测试:app应用
3.接口自动化测试:用来给前端web或app前端传输数据用的
4.单元测试-自动化测试 :针对开发人员的代码进行测试,由开发人员自己来测试
5.其他:安全测试(渗透测试):针对系统,数据,应用等安全方面进行测试
6.桌面应用自动化测试 :针对winddows的桌面应用程序进行自动化测试
7.嵌入式设备自动化测试:针对嵌入式设备的应用程序进行自动化测试
web自动化测
一.Selenium介绍
用来做web自动化测试的,开源的免费的工具,类型像我们玩游戏用的按键精灵,selenium可以直接运行在浏览器上,它支持所有的主流浏览器,可以接收指令,让浏览器自动加载界面,获取需要的数据,甚至可以页面截屏,脚本程序可以通过selenium API进行控制浏览器
特点:
1.开源软件:源代码开放,但是不一定免费
2.跨平台:这里平台指操作系统,可以在Linux,Windows,mac等操作系统运行
3.能够支持多种浏览器:能够支持多种浏览器 火狐,谷歌,IE,edge等
4.支持多语言:python,Java,c#,js,PHP
5.成熟稳定强大:被大公司使用,Google,华为,百度,腾讯等
以上这些特点也是我们选择自动化测试工具的依据
拓展其他的web自动化测试工具
QTP:支持web 桌面的自动化测试,收费的商用工具
root framework 自动化测试平台,开源实现web自动化测试,接口自动化测试,和桌面自动化测试工具
二.Selenium工作原理:selenium +webdriver 打开 chrome
python下发操作代码,由webdriver 将代码转换成 浏览器能识别的指令 进行具体操作 并返回操作结果给webdriver, webdriver将返回结果转义后返回给python控制台,Selenium工具包 来操作代码
程序脚本---Selenium API---chrome驱动 chrome浏览器
程序脚本---Selenium API---IE驱动 IE浏览器
三.环境搭建与安装
1.安装Selenium模块
pip install selenium
2.下载对应的浏览器驱动(chromedriver的版本一定要与Chrome的版本一致,)
有两个下载地址2选一即可
1、http://chromedriver.storage.googleapis.com/index.html
2、https://npm.taobao.org/mirrors/chromedriver/
3.配置
把 exe 文件放置到如下位置之一:
(1)chrome 的安装目录下
(2)Python 的安装目录下
以放入chrome 的安装目录下为例
解压压缩包,找到chromedriver.exe复制到chrome的安装目录中
复制chromedriver.exe文件的路径并加入到电脑的环境变量中去,进入环境变量编辑界面,添加到用户变量即可,双击PATH,将你的文件位置(C:\Program Files\Google\Chrome\Application)添加到后面
完成后在cmd下输入chromedriver验证是否安装成功:
用 Chrome 浏览器测试
from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.baidu.com")
四.元素定位
元素 = 标签头+标签尾+标签头和标签尾包括的文本内容
如何进行元素定位?
示例:<input id = "username" type = "text" name = "username" placeholder = "用户名" /><div id = "my_cart"> <span>我的购物车</span></div>
元素定位就是通过元素的信息或元素的层级结构来定位元素
元素的信息:是指元素的标签名及元素的属性
元素的层级结构是:元素之间相互嵌套的层级结构
五.浏览器开发者工具
浏览器开发者工具 主要用来查看元素的信息,同时也可以查看接口的相关信息
使用方式
1.直接按F12
2.鼠标右键---点击 "查看"
六.元素定位方法介绍
1.ID定位
前提:存在ID属性的前提下
通过元素的ID属性值 来进行元素的定位,在HTML中 ID是唯一的
定位方法:find_element_by_id(id) # id的参数表示是id的属性值
练习1:
打开注册A.html页面,完成以下操作
1)使用id定位,输入用户名:admin
2)使用id定位,输入密码:123456
3)3秒后关闭浏览器窗口
实现代码如下:
#导包seleniumfrom selenium import webdriverfrom time import sleep#创建浏览器驱动对象web = webdriver.Chrome()#打开浏览器网站web.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")#在用户名框中输入userAweb.find_element_by_id("userA").send_keys("admin")#密码框中输入123456web.find_element_by_id("passwordA").send_keys("123456")#等待3秒sleep(3)#退出浏览器web.quit()
2.name定位
通过元素的name属性值进行元素定位,name属性值在HTML中是可以重复的
定位方法:find_element_by_name(name) #name的参数表示是name的属性值
练习2:
打开注册A.html页面,完成以下操作
1)使用name定位,输入用户名:admin
2)使用name定位,输入密码:123456
3)3秒后关闭浏览器窗口
from selenium import webdriverfrom time import sleepweb = webdriver.Chrome()web.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")web.find_element_by_name("userA").send_keys("admin")web.find_element_by_name("passwordA").send_keys("123456")sleep(3)web.quit()
3.class_name定位
注意:class="emailA dzyxA"有多个值时,只能使用其中一个定位
定位方法:find_element_by_class_name(name)
练习3:
打开注册A.html页面,完成以下操作
1)使用class_name定位电话号码A,输入:188888888
2)使用class_name定位电子邮箱A,输入:123qq.com
3)3秒后关闭浏览器窗口
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_class_name("telA").send_keys("188888888")driver.find_element_by_class_name("emailA").send_keys("123qq.com")sleep(3)driver.quit()
4.tag_name定位(标签名字定位,如input)
通过元素的标签名称进行定位,在同一个HTML页面当中,相同标签元素会有很多,所以不建议使用。
定位方式:find_element_by_tag_name(name)
练习4:
打开注册A.html页面,完成以下操作
1.使用tag_name定位用户名输入框,并输入:admin
2.3秒后关闭
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_tag_name("input").send_keys("admin")sleep(3)driver.quit()
5.link_text定位
通过超链接的【全部文本信息】进行元素定位:主要定位a标签 <a /a>
<a href="http://www.sina.com.cn">新浪</a>
练习5:
1.使用link_text定位(新浪)超链接,并点击
2.3秒后关闭浏览器窗口
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_link_text("访问 新浪 网站").click()sleep(3)driver.quit()
6.partall_link_text定位
通过超链接的【局部文本信息】进行元素定位:主要定位a标签 <a /a>
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_partial_link_text("访问").click()sleep(3)driver.quit()
7.xpath定位:是一种可以定位的标记语言
定位方法 :driver.find_element_by_xpath( )
Xpath定位方式
1)路径定位
2)属性定位
3)属性与逻辑结合
4)属性与层级结合
1)路径定位:
绝对路径:从最外层元素 到 指定元素之间所有经过元素层级路径,如:/html/body/div/p[2]
1):表达式是以 "/html" 开头,元素的层级之间以 "/"分隔
相同层级的元素可以使用下标,下标从1开始
需要列出元素所经过的所有层级元素,实际工作当中,一般不使用绝对路径
例如:/html/body/div/fieldset/form/p[1]/input
相对路径 匹配任意层级的元素,是以"/tag_name"或"//*"开头
例如://p[5]/button
练习
打开注册A.html页面,完成以下操作
1.使用绝对路径定位用户名输入框,并输入:admin
2.暂停2秒
3.使用相对路径定位用户名输入框,并输入:123456
绝对路径:/html/body/div/fieldset/form/p/input
相对路径: //*[@id="passwordA"]
import timefrom selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("/html/body/div/fieldset/form/p/input").send_keys("admin")time.sleep(3)driver.find_element_by_xpath('//*[@id="passwordA"]').send_keys("123456")time.sleep(3)
2)属性定位:
//*或者 //tag_name //*[@属性名 = '属性值 ']
例如:"//*[@placeholder = '请输入用户名']"
练习:利用元素属性信息精确定位用户名输入框,并输入:admin
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("//*[@placeholder = '请输入用户名']").send_keys("admin")
3)属性与逻辑结合
使用前提:解决元素之间有相同属性 重名问题
//*或者 //tag_name开头 //*[@属性名1 = '属性值1 ' and @属性名2 = '属性值 2']
例如://*[@placeholder = '请输入用户名' and @ id = 'userA']
ctrl +f 调出搜索框
练习:使用属性与逻辑结合定位策略,在test1对应的输入框里输入:admin
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("//*[@name = 'user' and @class = 'login']").send_keys("admin")
4)属性与层级结合【在任意层级当中 可以结合属性来定位】
注意:工作中最常用的定位方式
使用前提:要找的元素没有属性,但是有父级
定位方法://*或//tag_name [@id='p1']/input
图中input的属性 上级 是 P
练习:使用层级与属性结合定位策略,在test1对应的输入框里输入:admin
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("//p[@id='p1']/input").send_keys("admin")
xpath---延伸
1.//*[text()='value'] 文本内容是value的元素
2.//*[contains(@属性名称,'value')] 属性中含有xxx的元素
要定位的元素中,属性值包含了value的内容
例如://*[contains(@placeholder,'用户名')]
3.//*[starts-with(@属性名称,'value')] 属性以value开头的元素
#//*[starts-with(@placeholder,'请输入用')] 来定位用户名from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("//*[starts-with(@placeholder,'请输入用')]").send_keys("admin")
#//*[starts-with(@name,'u')] 来定位用户名from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_xpath("//*[starts-with(@name,'u')]").send_keys("admin")
Xpath元素属性定位时 ,class注意事项
<input type="email" name="emailA" class="emailA dzyxA" placeholder="请输入电子邮箱">
*当使用class属性定位时,要输入全部内容 即 //*[@class = 'emailA dzyxA']
8.css定位
CSS定位方式:
element = driver.find_element_by_css_selector(css_selector)
#css_selector表示的是CSS选择器表达式
CSS定位策略
id选择器
class选择器
元素选择器
属性选择器
层级选择器
1).id选择器
表达式:#id #表示通过元素的id进行元素选择,id是属性值
例如:#userA
练习:通过css的id选择器 定位用户名输入:admin
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_css_selector("#userA").send_keys("admin")
2).class选择器
表达式: .class #表示通过元素的class属性进行元素选择,此处的class表示的是class属性的其中一个属性值
例如:.emailA
练习:通过css的class选择器定位电子邮箱输入框,输入:123@qq.com
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_css_selector(".emailA").send_keys("123@qq.com")
3).元素选择器
即通过元素标签名称,来选择元素,(不推荐使用,因没办法精准定位)
表达式:tag_name (默认返回第一个input)
例如:input
4).属性选择器
即通过元素的属性 来选择元素
表达式:[属性名称 = '属性值']
例如:[class='emailA dzyxA']
练习:定位电子邮箱,输入邮箱地址:123@qq.com
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_css_selector("[class='emailA dzyxA']").send_keys("123@qq.com")
5).层级选择器
即根据 元素的父子关系来选择
表达式1:element1 > element2 通过element1 来定位 element2 ,并且element2必须为element1直接子元素
例如:p[id = 'p1'] > input 是指 定位指定元素p下的直接子元素input
练习:使用css定位方式中层级选择器定位用户名输入框,输入:admin
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_css_selector("p[id ='pa']>input").send_keys("admin")
表达式2: element1 element2 通过element1 来定位 element2 ,并且element2必须为element1后代元素
例如:p[id = 'p1'] input 是指 定位指定元素p下的后代元素input
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")driver.find_element_by_css_selector("p[id ='pa'] input").send_keys("admin")
CSS延伸
input[type^ = 'p'] type的属性是以p字母开头的元素
例如:input[placeholder^ = '请']
input[type$ = 'd'] type的属性是以d字母结束的 元素
例如:input[type^ = 'd']
input[type* = 'w'] type的属性是包含w字母的元素
例如:input[type^ = 'w']
9.定位一组元素:针对以上的定位方法+s 即"elements"
find_elements_by_id(id)
find_elements_by_tag_name(tag_name)
.........
定位一组元素返回的值是一个列表
可以通过下标来使用列表中的元素
下标是从0开始的
练习:
1.使用tag_name定位密码输入框(第二个input标签)并输入:123456
2.3秒后关闭浏览器窗口
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()driver.get("file:///D:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/UI%E8%87%AA%E5%8A%A8%E5%8C%96/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")elements = driver.find_elements_by_tag_name("input")#elements是列表elements[1].send_keys("123456")#需求是列表中的(第二个input标签)并输入:123456sleep(3)driver.quit()
定位元素的另一种写法
find_element(By.ID, id) 如下操作需要导入By类
总结
1.id,name,class_name:为元素属性定位
2.tag_name:为元素标签名称
3.link_text,partial_link_text:为超链接定位(a标签)
4.xpath:为元素路径定位
5.CSS:为css选择器定位
XPath 与CSS定位方法对比
定位方式 | xpath | css |
元素名 | //input | input |
id | //input[@id ='userA'] | |
class | //*[@class='telA'] | .telA |
属性 | 1.//*[text()='xxx'] | 1.input[type^ ='p'] |
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除