1.day1-初识自动化测试
常用工具:QTP、selenium、RFT、watir、sahi
使用自动化测试的条件
1)手工测试已经完成,后期不影响进度;
2)项目周期长,重复性工作给机器去实现;
3)需求稳定,项目变动不大;
4)自动化测试脚本复杂度比较低;
5)可重复利用。
场景
1)频繁的回归测试;
2)冒烟测试;
3)互联网迭代频繁;
4)传统行业需求变化不大,应用频繁;
5)性能测试
Xpath的写法和css选择器的写法
元素定位:计算机通过一系列计数手段找到元素(按钮、输入框、模拟键盘等)
Xpath:xml路径语言,是一种用来在html/xml文档中查找信息的语言。
Xml 可拓展标记语言,传输和存储数据
Html 超文本标记语言,展示数据
Xpath
通过节点名定位(http://www.ifeng/)
html 定位到html节点
html/head 定位到head节点
html/head/meta 定位好head中的所有meta节点
相对路径定位节点(http://www.ifeng/)
//title 使用相对路径定位到title节点
//meta 使用相对路径定位到所有meta节点
使用.和..定位本身和父节点(http://www.ifeng/)
/html/head/title/./.. 使用.定位到title本身再使用..定位到title的父节点
/html/head/title/./../body 使用.定位到title本身再使用..定位到title的父节点,然后在定位到body子节点
通过@定位 格式 标签名[@属性名='属性值']
/meta[@name='author'] 定位到所有的meta,再从中找到name=author的那一个
//div[@id] 定位到所有div标签,再过滤出有id属性的节点
通配符定位节点
//* 匹配所有节点
/* 匹配绝对路径最外层
//*[@*] 匹配所有有属性的节点
/html/node()/meta 匹配所有含有meta的节点
css选择器
.weixinBottom 通过class的值进行定位
#wx 通过id的值进行定位
div 通过标签进行定位
meta,link 匹配两种标签结果集
div a 匹配div标签中的所有后代a标签
div>a 匹配div后是一个a标签的节点
div+div 匹配div后面的同胞div节点
[id] 匹配所有含有id属性的标签
[id='wx'] 匹配所有含有id并且值为wx的标签
[type="submit"]
[class~="Login"] 定位标签属性class值中有独立Login的节点
[name|=msapplication] 定位标签属性name的值以msapplicatio开头的节点(该节点需为一个完整的单词)
2.day2-Selenium自动化测试框架
Selenium采用JavaScript单元测试工具JSunit为核心,只需在测试用例中把预期的用户行为与结果都描述出来,就得到了一个可自动化运行的功能测试套件。Selenium测试直接运行在浏览器中,像用户操作一样。
Selenium webdriver与selenium RC相比,支持无头执行,API更复杂,纯测面向对象的API,可测试Android/iphone应用程序
浏览器驱动的配置
Pip install selenium==2.53.1 Pip list 已安装的服务 Pip freeze 显示自行安装的服务
Selenium IDE:一款Firefox的插件,提供了一个图形用户界面,用于记录使用Firefox浏览器,用于学习和使用selenium用户操作。
Selenium的API基础
窗口设置
from selenium import webdriver
driver = webdriver.xxx()
maximize_window() 最大化
get_window_size() 获取浏览器尺寸
set_window_size() 设置浏览器尺寸
close() or quit()
页面操作
1)url的格式:
形式 scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:协议(例如:http, https, ftp)
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径 http://url的结构
query-string:参数,发送给http服务器的数据,参数使用&隔开
anchor:锚(跳转到网页的指定锚点位置)
2)HTTP 默认端口号:80;HTTPS,HTTP + SSL(安全套接字层),默认端口号:443
3)DNS域名服务
4)页面请求操作
driver.get(url) 请求某个url对应的响应
refresh() 刷新页面
back() 回退到之前的页面
forward() 前进到之后的页面
获取断言信息:断言,表示为一些布尔表达式,程序员相信在程序的某个特定点该表达式为真,可以在任何时候启用和禁用断言验证。因此可以在测试时启用断言而在部署时禁用断言。
Current_url 获取当前访问页面url
Title 获取当前浏览器的标题
Get_screenshot_as_png() 保存图片
Get_screenshot_as_file(file) 直接保存
Page_source 网页源码
3.day3-元素的定位
2种方法——
1.直接调用 driver.find_element_by_xxx(value)
2.使用By类型 from selenium.webdrivermon.by import By
Driver.find_element(By.xxx.value)
8种方式——
1.driver.find_element_by_id(value)
2.driver.find_element_by_name(value)
3.driver.find_element_by_class_name(value)
4.driver.find_element_by_tag_name(value)
5.driver.find_element_by_link_text(value)
6.driver.find_element_by_partial_link_text(value)
7.driver.find_element_by_xpath(value)
8.driver.find_element_by_css_selector(value)
定位一组元素 driver.find_elements_by_xxx(value) 返回一个元素对象列表
4.day-selenium的API高级
1.多标签/多窗口之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
1)获取所有窗口的句柄
handles = driver.window_handlers
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
2)通过窗口的句柄进入的窗口 driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n]) 通过窗口句柄激活进入某一窗口
2.多表单/多框架切换
在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
多表单?实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
1)处理方法
直接使用id值切换进表单 driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el) /driver.switch_to_frame(el)
2)driver.switch_to.default_content() 跳回最外层的页面。
driver.switch_to.parent_frame() 跳回上层的页面。
3.鼠标和键盘操作
手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供
1)鼠标操作
* 导入动作链类,动作链可以储存鼠标的动作,并一起执行
from selenium.webdriver import ActionChains
ActionChains(driver)
* 执行ActionChains中储存的所有动作
perform()
* 鼠标右击
el = driver.find_element_by_xxx(value)
context_click(el)
对el执行右击
* 双击操作
el = driver.find_element_by_xxx(value)
ActionChains(driver).double_click(el).perform()
* 鼠标悬停
el = driver.find_element_by_xxx(value)
ActionChains(driver).move_to_element(el).perform()
2)键盘操作
键盘操作使用的是Keys类,一般配合send_keys使用
from selenium.webdrivermon.key import Key
* 常用键盘操作
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) 类似还有c,x,v
3)弹出框操作
1) 进入到弹出框中 driver.switch_to.alert()
2) 接收警告 accept()
3) 解散警告 dismiss()
4) 发送文本到警告框 send_keys(data)
4)下拉框操作
selenium关于下拉框的操作都交由Select类进行处理,一般获取到下拉框元素之后使用该类构建对象,调用对象的响应方法就能操作元素
1) 导入Select类
from selenium.webdriver.support.select import Select
2) 将定位到的下拉框元素传入Select类中
selobj = Select(element) 下拉框元素已经定位到
3) 调用响应方法选择下拉框中的选项
select_by_index() 通过索引选择,index 索引从 0 开始
select_by_value() 通过值选择(option标签的一个属性值)
select_by_visible_text() 通过文本选择(下拉框的值)
all_selected_options 查看所有已选
first_selected_option 查看第一个已选
is_multiple 查看是否是多选
options 查看选项元素列表
取消选择
deselect_by_index()
deselect_by_value()
deselect_by_visible_text()
5)调用js代码
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言,用来给HTML网页增加动态功能。
JavaScript 是属于网络的脚本语言,被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。
1.重要的js代码
* js = "window.scrollTo(x,y) "
x为水平拖动距离,y为垂直拖动举例
* js= "var q=document.documentElement.scrollTop=n"
n为从顶部往下移动滚动举例
2.driver.execute_script(js) 执行js代码
6)浏览器等待
网速慢,网站内容过多,不进行等待而直接定位元素,可能会抛出异常,于是要进行等待。
显示等待是根据条件进行等待,等待条件出现
from selenium.webdrivermon.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,
默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置
时间检测不到则抛出异常。
隐式等待是根据是件进行等待,等待特定时间
driver.implicitly_wait(n)
n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待
7)cookie操作
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行会话保持而储存在用户本地终端上的数据(通常经过加密)。1.因为http是无状态协议,他不对之前的的访问状态做管理,也就是说无法根据之前的登录状态进行本次访问的处理。2.没有状态管理就不能保持登录状态,这样就会很麻烦。所以要使用cookies。
get_cookies() 获取所有cookies
get_cookie(key) 获取key对应的值
add_cookie(cookie_dict) 设置cookies
delete_cookie(name) 删除指定名称的cookie
delete_all_cookies() 删除所有cookie
5.day5-selenium的API的封装
函数封装是一种函数的功能,它把一个程序员写的一个或者多个功能通过函数、类的方式封装起来,对外只提供一个简单的函数接口。
If __name__ == ‘__main__’:
com = Common()
com.open_url(‘http://www.baidu’)
com.close_driver()
对selenium的常用操作进行封装
(1)封装开启关闭浏览器;
(2)封装定位操作;
(3)封装对元素的基本操作
Unittest单元测试框架
是专门用来进行测试的框架
test fixture: 代表了用例执行前的准备工作和用例执行之后的清理工作。
test case: 测试用例,这个相信大家都不陌生。是测试的最小单位,一般检查一组输入的响应(输出)是否符合预期。unittest模块提供了TestCase类来帮助我们创建测试用例;
test suite: 经常被翻译成”测试套件”,也有人称为”测试套”,是测试用例或测试套件的集合,一般用来把需要一起执行的用例组合到一起;
test runner: 用来执行测试用例并输出测试结果的组件。可以是图形界面或命令行界面;
import unittest
Class Test1(unnittest.TestCase):
def test_001(self):
print(‘001’)
def test_002(self):
print(‘002’)
def est_003(self):
print(‘003’)
if __name__ == ‘__main__’:
unittest.main()
1.通过继承unittest.TestCase进行编写,继承unittest.TestCase的类会被框架识别为测试用例。
2.setUp和TearDown是用于事前和事后做相关处理动作的,就是前面说的Test Fixture,会在每个测试用例运行前后被框架自动调用
3.所有以test开头的方法会被框架自动识别为测试用例,并自动调用执行,不是以test开头的不会被调用
4.unittest.main()是最简单的测试执行方式
5.调用unittest.main()方法后,继承自unittest.TestCase类的类会被自动识别为测试用例并且被调用。也可用测试套件方式运行。
断言是测试用例的核心。我们使用assertEqual()来判断预期结果,用assertTrue()和assertFalse来做是非判断。
unittest支持命令行接口,我们可以在命令行里指定运行具体的测试用例。
python -m unittest test.Tese1
unittest+selenium
1. Commonlib目录存放通用模块(我们封装的selenium模块)
2.创建Business目录 ,根据业务创建测试功能模块
3.创建Testcase目录存放测试用例
更多推荐
软件测试入门自学笔记(7)web自动化测试
发布评论