#web自动化基本理论
一,自动化简介
需求分类:
显性需求:需求文档
隐性需求:用户习惯
行业标准
竞品功能
删除:硬删除:直接在数据库中将数据删除
软删除:在数据库中做标记
自动化测试可以用于兼容性测试
在测试流程中,分析和设计是重中之重
1软件系统三层结构:
1,客户端
2,服务端
3,数据库
协议:
自动化测试的分类:代码级,接口级,页面级
优先级别 :接口级>页面级>代码级
二,适合做自动化项目的要求
1,需求变动不频繁
2,项目周期较长
3,自动化测试脚本可重复使用
自动化适合用的地方
1,回归测试
2,兼容性测试
3,迭代项目中,成熟功能
三,自动化常用测试工具
XUnit:Junit,Cppunit,UNnit,PyUnit...单元测试工具
XMock:JMock,NMock...
2,接口级自动化常用工具:
loadRunner:支持全协议,重点支持HTTP...
SOAPUI
Webload
PPT(IBM)
JMeter(APache)
浏览器插件:postman,RESTClient
web 自动化一:浏览器的基本操作和元素定位
一,搭建环境
1,安装selenium
pip install selenium
2,安装浏览器驱动
https://chromedriver.storage.googleapis.com/index.html---->谷歌浏览器驱动地址
安装步骤:
1,下载对应版本的浏览器驱动文件
2,解压下载文件,将里面的exe文件复制到python的安装根目录下
3,将下载
注意事项:
1)浏览器驱动必须和测试的浏览器相对于,即谷歌浏览器必须用谷歌浏览器驱动,火狐浏览器必须用火狐浏览器驱动
2)驱动的版本必须和浏览器版本一致
二,浏览器的基本操作
1.1 打开浏览器,关闭浏览器,窗口最大化,自定义窗口大小
步骤:
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.set_window_size(300,300)
time.sleep(4)
driver.maximize_window()
time.sleep(4)
driver.quit()
1.2浏览器的前进,后退,刷新
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.maximize_window()
sleep(2)
driver.get('http://www.baidu.com')
sleep(1)
driver.get('http://www.jd.com')
sleep(1)
driver.get('http://www.taobao.com')
sleep(1)
driver.back()
sleep(1)
driver.forward()
sleep(1)
driver.refresh()
sleep(3)
driver.quit()
driver.close()
1.3,打开手机百度网页
from selenium import webdriver
from time import sleep
mobileEmulation={"deviceName":"iPhone X"}---->deviceName固定名称,不可变
options=webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation",mobileEmulation)
driver=webdriver.Chrome(options=options)
driver.get("http://www.baidu.com")
sleep(3)
driver.quit()
三,元素定位
3.1浏览器中F12作用
f12开发者工具
elements---->做页面自动化
console---->web项目手工测试
network--->接口测试
3.2什么是元素定位
元素定位就是查找HTML元素的过程,操作页面元素之前,首先要对元素进行定位,所以定位是自动化脚本编写的开始.
find_element 使用给定的方法定位和查找一个元素
find_elements 使用给定的方法定位和查找所有的元素
通过标签属性定位包括:ID,name,class_name
3.3,元素定位的八大方法
一,通过id定位
当所定位的元素具有id属性的时候,我们就可以通过by_id来定位.
语法:driver.find_element_by_id('id的属性值')
完整步骤:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
A=driver.find_element_by_id('userA')
如果是find_elements_by_id('userA'),找到是一个列表,后面就不能用get_attribute来查看源码.
print(A.get_attribute('outerHTML'))
driver.quit()
二, 通过name 定位
driver.find_element_by_name('name的属性值')
案例:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
a=driver.find_element_by_name('userA')
print(a.get_attribute('outerHTML'))
driver.quit()
三,通过class_name定位:找到class就可以用class_name定位
使用范围:
1,定位元素有class属性
2,class属性不是动态的
3,如果同一个元素,有多个class属性值,如class='bg s_ipt_wr quickdelete-wrap',只选取其中一个值即可
语法: driver.find_element_by_class_name('class 的属性值')
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
A=driver.find_element_by_class_name("c-tips-container" )
print(A.get_attribute('outerHTML'))
driver.quit()
注:在HTML页面中,ID是唯一的,而name,class_name不一定是唯一的.
四,通过tag_name 定位元素---->通过标签定位
语法:单数形式
driver.find_element_by_tag_name('标签名')
复数形式
driver.find_elements_by_tag_name('标签名') 返回的是列表,要取出元素需要遍历
单数形式案例:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
B=driver.find_element_by_tag_name('input')
print(B.get_attribute('outerHTML'))
driver.quit()
复数形式案例:
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
B=driver.find_elements_by_tag_name('input')
print(len(B))
for i in B:
print(i.get_attribute('outerHTML'))
driver.quit()
五,通过超链接定位
语法: driver.find_element_by_link_text('超链接文本')--->必须输入全部链接文字
driver.find_element_by_partial_link_text('超链接的文本的部分文字')-->可以输入链接文字里的部分文字,部分内容必须是连续的内容
精准定位案例:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
A=driver.find_element_by_link_text('贴吧')
print(A.get_attribute('outerHTML'))
driver.quit()
模糊定位案例:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
A=driver.find_elements_by_partial_link_text('新浪')
print(len(A))
for i in A:
print(i.get_attribute('outerHTML'))
driver.quit()
六, xpath定位
语法:driver.find_element_by_xpath("xpath表达式")
xpath表达式:
路径:绝对路径 /表示绝对路径
相对路径 //表示相对路径
1,标签+属性
//标签名[@属性名='属性值']
案例:
from selenium import webdriver
driver=webdriver.Chrome()
url="file:///"+"E:/web/练习页面/Test_Xpath.html"
driver.get(url)
A=driver.find_element_by_xpath("//input[@name='name1']")
print(A.get_attribute('outerHTML'))
2,层级定位:当子标签没有可以供定位的元素时,可以通过定位它的父标签来定位子标签
语法:变量=driver.find_element_by_xpath("//父标签名[@父标签属性名='属性值']/子标签名")
注://表示相对路径
层级定位不仅限于2层,可以是多层
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\注册A.html')
A=driver.find_element_by_xpath("//p[@id='p1']/input")
print(A.get_attribute('outerHTML'))
driver.quit()
3, 索引:
当一个父标签有多个相同的子标签时,需要加索引
//父标签[@父标签属性名='父标签属性值']/子标签名[索引值]
如果定位的是父标签下的第一个子标签,可以不写索引值.
案例:
driver=webdriver.Chrome()
driver.get('E:\web\练习页面\Test_Xpath.html')
A=driver.find_element_by_xpath("//form[@id='formID']/input[2]")
B=driver.find_element_by_xpath("//form[@id='formID']/input[3]")
print(A.get_attribute('outerHTML'))
print(B.get_attribute('outerHTML'))
driver.close()
4,逻辑:
当元素属性与其他元素属性有相同部分的时候,不能只利用一个属性定位,需要多个元素属性来进行定位,and
语法://标签名[@属性名='值' and @属性名='属性值'and.....]
案例:
from selenium import webdriver
import os
driver = webdriver.Chrome()
url="file:///"+os.path.abspath('练习页面/xpath.html')
print(url)
driver.get(url)
A = driver.find_element_by_xpath("//input[@name='user'and @class='login-test']")
print(A.get_attribute('outerHTML'))
driver.close()
5,模糊匹配
contains
//标签名[contains(@[属性名,属性值或者部分属性值)]]
如:driver.find_element_by_xpath("//input[contains(@name,'1')]")
---->当常用方法无法定位到元素时,可以用Xpath定位方法
七,css选择器定位
语法: driver.find_element_by_css_selector('css表达式')
css表达式:
1,ID,class 属性
.表示class属性
2,其它属性--标签+属性
标签名[属性名=属性值]
案例1,使用标签定位
from selenium import webdriver
import os
driver=webdriver.Chrome()
url="file:///"+os.path.abspath("练习页面/注册A.html")
driver.get(url)
css_selector=driver.find_element_by_css_selector("#userA")--->
css_selector1=driver.find_element_by_css_selector(".TelA")--->使用class定位
css_selector2=driver.find_element_by_css_selector("input[placeholder='电话A']")-->使用标签+其它属性定位
print(css_selector.get_attribute('outerHTML'))
driver.quit()
3,层级定位
父标签[父标签属性名=父标签属性值]>子标签或者将'>'换成空格
B=driver.find_element_by_css_selector("p[id='p1']>input")
或B=driver.find_element_by_css_selector("p#p1 input")
4,索引
父标签[父标签的属性名=父标签的属性值]>:nth-child(索引值),索引从1开始
父标签[父标签的属性名=父标签的属性值]>子标签:nth-of-type(索引),索引从1开始
5,逻辑
标签名[属性名1=属性值1][属性名2=属性值2] 例:password=driver.find_element_by_css_selector('input[type="password"][placeholder="密码A"]')
6,模糊匹配
^以....开头
password=driver.find_element_by_css_selector('input[type^="pass"]')
$以.....结尾
password=driver.find_element_by_css_selector('input[type$="word"]')
*匹配所有 : 语法 标签名[属性名*='部分属性值'] password=driver.find_element_by_css_selector('input[type*="word"]')
设置python模板
file-->setting--->file and code templates---->python script