软件流程:需求分析-设计-编码-单元测试-集成测试-系统测试-验收测试
单元测试:对程序中的单个子程序或独立功能的代码进行测试的过程
集成测试:通过单元模块组装成系统或子系统,在进行测试,重点检查模块的接口是否正确
系统测试:对整个产品进行测试
验收测试:验证是否满足用户需求
-------------------------------------------------------------------------------------------------------------------
功能测试可以分为:逻辑功能测试、界面功能测试、易用性测试、安装测试、兼容性测试。。
性能测试:利用自动化工具模拟多种正常,峰值以及异常负载条件对系统的各项性能指标进行测试
自动化测试:以人为驱动的测试转化为机器的一种过程:功能自动化,性能自动化
-----------------------------------------------------------------------------------------------------------------
适合自动化的项目:
1.任务明确,需求变更不频繁
2.比较频繁的回归测试
3.软件开发周期时间长
4.脚本可以重复使用
----------------------------------------------------------------------------------------------------------------------
自动化测试工具:
QTP:提供强大的录制回放功能
Roboot Framework :python编写的自动化测试框架
selenium:用于web程序测试工具,支持多平台,多预览,多语言实现自动化
--------------------------------------------------------------------------------------------------------------------
selenium:开源。免费,支持多平台、多语言
selenium IDE:Firefox的一个插件,支持录制和回放功能
selenium Grid:可以再多台机器上和构建环境中进行多个测试事项:并发执行、通过一个主机统一控制用例在不同环境,不同机器下进行
selenium RC:支持不同语言编写自动化脚本
webdriver:是selenium RC的代替品,提供一系列方法对网站端进行操作
----------------------------------------------------------------------------------------------------------------------
python +webdriver API
1.最大化
driver.maximize_window()
2.最小化
driver.minimize_window()
3.设置浏览器尺寸
driver.set_window_size(100,200)
4.控制浏览器前进后退
driver.back()
driver.forward()
driver.refresh()--刷新
5.关闭
driver.qult()
--------------------------------------------------------------------------
定位单个元素:
id,name(优先使用)
driver.find_element_by_id()
driver.find_element_by_name()
tag name ,class name
driver.find_element_by_class_name()
当class属性bg s_ge,中间有空格即为符合型,直选一个属性值就可以了如“s_ge”
tag标签
driver.find_element_by_tag_name("div") #适用于层级定位,不靠谱,同一界面容易出现相同的tag name
link text与partial link text
b.find_element_by_partial_link_text("首页").click() #模糊匹配
-------------------------------------------------------------------------------------------------------------------
xpath定位
xpath是一种在XML文档中定位元素的语言
1.绝对路径:driver.find_element_by_xpath("/html/body/div[2]/form/span/input").click()
1.相对路径:b.find_element_by_xpath("//*[@id="u1"]/a[5]").click()
//表示显示要查找的所有元素
css定位
driver.findElement(by.cssSelector( " input[value=’1’] " )).click(); 属性 value 值为 1 ,类型为 input
操作测试对象
clear()----清空元素
send_keys()----输入文字
click() ----点击
submit()---提交表单
---------------------------------------------------------------------------
size:返回元素尺寸
>>> t =b.find_element_by_id("kw").size
>>> print(t)
{'height': 22, 'width': 500}
text:获取元素文本
>>> t =b.find_element_by_id("su").text
>>> print(t)
attribute---获取元素属性值
>>> t =b.find_element_by_id("su").get_attribute("typy")
>>> print(t)
is_displayed()
>>> t =b.find_element_by_id("su").is_displayed()
>>> print(t)
True
鼠标事件
ActionChains 类鼠标操作常用方法
context_click() 右击
double_click() 双击
drag_and_drop() 移动
move_to_element() 鼠标悬停到一个元素上
click_and_hold() 按下鼠表左键在一个元素上
#先导入ActionChains包 from selenium.webdriver.common.action_chains import ActionChains #元素定位 context=b.find_element_by_link_text("地图") #右键点击 ActionChains(b).context_click(context).perform() ------------------------------------------------------ #双击 ActionChains(b).double_click(context).perform() ------------------------------------------------------- #移动 above=b.find_element_by_link_text("xxx") #目标路径 ActionChains(b).drag_and_drop(context,abrove).perform() ----------------------------------------------------------- #鼠标悬停 ActionChains(b).move_to_element(context).perform() ---------------------------------------------------------------- #鼠标左键 ActionChains(b).click_and_hold(abrove).perform()
键盘信息
from selenium import webdriver #导入模块 from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") #输入字符串 driver.find_element_by_id("kw").send_keys("selenium") time.sleep(3) #删除多输入的一个m driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #输入空格 driver.find_element_by_id("kw").send_keys(Keys.SPACE) #CTROL+A全选 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a") ---------------------------------------------------------------------- driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x") ------------------------------------------------------------------------ driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"v") ------------------------------------------------------------------------ #回车 driver.find_element_by_id("kw").send_keys(Keys.ENTER)
打印结果输出
>>> print(driver.title)
百度一下,你就知道
>>> print(driver.current_url)
https://www.baidu.com/
--------------------------------------------------------------------------------------------------
时间等待
1.导入time---------sleep()设置固定时间
2.implicity_wait():这是webdriver提供的一个超时等待,如果超出设置时间就会抛出异常
3.WebDriverWait():在设置时间内,默认每隔一段时间检测一次,如果超时报错
#格式 from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None): driver:Webdirver的驱动程序 timeout:最长超时时间 poll_frequency:休眠时间间隔 ------------------------------------------------ b = WebDriverWait(driver,30).until(x:x.find_element_by_id()) WebDriverWait一般有until与until_not()方法配合使用 until(method,message="") 驱动一个参数,查看返回值为True until_not(method,message="") 驱动一个参数,查看返回值为Flase
定位一组元素
find_elements
#查询所以标签是input的元素 b = find_elements_by_tag_name("input") for s in b: if s.get_attribute("type") == "check": s.click()
层级定位
当页面有很多基本属性相同时,先定位父级再定位子集
b = find_element_by_id("kw").find_element_by_link_text("kw").click()
定位frame中对象
在 web 应用中经常会出现 frame 嵌套的应用,假设页面上有 A、B 两个 frame,其中 B 在 A 内,那么
定位 B 中的内容则需要先到 A,然后再到 B。
switch_to_frame 方法可以把当前定位的主体切换了 frame 里。怎么理解这句话呢?我们可以从 frame
的实质去理解。frame 中实际上是嵌入了另一个页面,而 webdriver 每次只能在一个页面识别,因此才需要
用 switch_to.frame 方法去获取 frame 中嵌入的页面,对那个页面里的元素进行定位。
#coding=utf-8 from selenium import webdriver import time import os driver = webdriver.Firefox() file_path = 'file:///' + os.path.abspath('frame.html') driver.get(file_path) driver.implicitly_wait(30) #先找到到 ifrome1(id = f1) driver.switch_to_frame("f1") #再找到其下面的 ifrome2(id =f2 driver.switch_to_frame("f2") #下面就可以正常的操作元素了 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3) driver.quit()
Alter弹窗处理;
switch_to_alter()切到alter
accept()确认
dismiss()取消
send_keys()有输入框时才能使用
浏览器多窗口处理
要想在多个窗口之间切换,首先要获得每一个窗口的唯一标识符号(句柄)。通过获得的句柄来区别
分不同的窗口,从而对不同窗口上的元素进行操作
from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com/") #获得当前窗口 nowhandle=driver.current_window_handle #打开注册新窗口 driver.find_element_by_name("tj_reg").click() #获得所有窗口 allhandles=driver.window_handles #循环判断窗口是否为当前窗口 for handle in allhandles: if handle != nowhandle: driver.switch_to_window(handle) print 'now register window!' #切换到邮箱注册标签 driver.find_element_by_id("mailRegTab").click() time.sleep(5) driver.close() #回到原先的窗口 driver.switch_to_window(nowhandle) driver.find_element_by_id("kw").send_keys(u"注册成功!") time.sleep(3) driver.quit()
在本例中所有用到的新方法:
current_window_handle
获得当前窗口句柄
返回的所有窗口的句柄到当前会话
switch_to_window()
用于处理多窗口操作的方法,与我们前面学过的 switch_to_frame() 是类似,switch_to_window()用于
处理多窗口之前切换,switch_to_frame() 用于处理多框架的切换。
close()
如果你足够细心会发现我们在关闭“注册页”时用的是 close()方法,而非 quit();close()用于关闭当前
窗口,quit()用于退出驱动程序并关闭所有相关窗口。
下拉框要想定
位下拉框中的内容,首先需要定位到下拉框;这样的二次定位
上传文件
文件上传操作也比较常见功能之一,上传功能操作 webdriver 并没有提供对应的方法,关键上传文
件的思路。
上传过程一般要打开一个系统的 window 窗口,从窗口选择本地文件添加。所以,一般会卡在如何操
作本地 window 窗口。其实,上传本地文件没我们想的那么复杂;只要定位上传按钮,通 send_keys 添加
本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。下面通地例子演示操作过
程
滚动条
用于标识滚动条位置的代码
<body onload= "document.body.scrollTop=0 "> <body onload= "document.body.scrollTop=100000 ">
-------------------------------------------------------------
#coding=utf-8 from selenium import webdriver import time #访问百度 driver=webdriver.Firefox() driver.get("http://www.baidu.com") #搜索 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3)
#将页面滚动条拖到底部 js="var q=document.documentElement.scrollTop=10000" driver.execute_script(js) time.sleep(3) #将滚动条移动到页面的顶部 js_="var q=document.documentElement.scrollTop=0" driver.execute_script(js_) time.sleep(3) driver.quit()
cookie
有时候我们需要验证浏览器中是否存在某个 cookie,因为基于真实的 cookie 的测试是无法通过白盒
和集成测试完成的。webdriver 可以读取、添加和删除 cookie 信息。
webdriver 操作 cookie 的方法有:
get_cookies() 获得所有 cookie 信息
get_cookie(name) 返回特定 name 有 cookie 信息
add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
delete_cookie(name) 删除特定(部分)的 cookie 信息
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 添加会话信息。 driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'}) #遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息 for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) ##### 下面可以通过两种方式删除 cookie ##### # 删除一个特定的 cookie driver.delete_cookie("CookieName") # 删除所有 cookie driver.delete_all_cookies() time.sleep(2) driver.close()