一.概念:
通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行测试
二.分类:
1.自动化功能测试
- 单元测试:开发者搞定
- 功能测试:
- 接口测试:大中型项目或者长期项目采用自动化
2.自动化性能测试
- 模拟请求
三.web自动化条件和使用范围
1.使用自动化的前提条件
- 手动测试已经完成,后期在不影响进度的前提下逐渐实现自动化
- 项目周期长,重复性的工作都交给机器实现
- 需求稳定,项目变动不大
- 自动化测试脚本复杂度低
- 可重复利用
2.使用自动化的场景
- 频繁的回归测试
- 冒烟测试
- 互联网迭代频繁
- 传统行业需求变化不大,应用频繁
- 性能测试
四.Selenium自动化测试框架
1.历史版本
-
一代:现在基本不使用
-
二代:主推webdriver, 是selenium RC + webdriver 的集合
-
三代:移除selenium,只剩webdriver
2.selenium组件 -
Selenium IDE:主要用来录屏,几乎不用
-
Selenium RC:远程控制(功能简陋)
-
Selenium WebDriver:属于RC的升级版,直接发送命令给浏览器,并检索结果,主要使用
-
Selenium Grid:网格用于运行在不同的机器,不同的浏览器同时以最小化执行时间并行测试的工具,使selenium同时运行于多个平台。
3.RC 与 Webdriver对比 -
RC需搭建服务,webdriver直接安装驱
-
RC通过js服务与浏览器互动,速度较慢;Webdriver直接通过本地驱动,速度较快
-
RC不支持无头(不开启界面,只在内存中运行的浏览器,所谓的虚拟浏览器),而Webdriver支持;
-
webdriver面向对象
-
webdriver功能强大
-
webdriver可面向移动端,也就是可测试iphone/Andrioid应用程序
五.Selenium API基础
1.HTTPS:
- HTTP+SSL(安全套接字)
- 默认端口:443
2.断言:
- 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定的点该表达式为真,可以在任何时候启用和禁用断言验证,因此在测试时启用断言而在部署时禁用断言。
- Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。
3.Selenium的元素定位
- id: id定位
- name:name属性定位
- class name:伪类名定位
- tag name:标签名定位
- link text:链接文本定位
- partial link text:部分链接文本
- xpath:xpath路径定位
- css selector:css选择器
4.表单切换
- 1.直接使用id值切换(推荐使用): driver.switch_to.frame(value)
- 2.定位到表单元素,再切换进入:
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el) - 3.跳回最外面的页面
dirver.switch_to.default_content() - 4.跳回上层的页面
driver.switch_to.parent_frame()
5.弹出框操作
- 进入到弹出框:driver.switch_to.alert()
- 接收警告:accept()
- 解散警告:dismiss()
- 发送文本到警告框seed_keys(data)
6.下拉框操作
下拉框的操作到交给Select类进行处理
from selenium.webdriver.support.select import Select
selobj = Select(element) #下拉框元素传入Selement
- 调用响应方法选择下拉框的选项
- select_by_index()
- select_by_value()
- select_by_visible_text()
7.调用js代码
重要的js代码
- js = “window.scrollTo(x, y)”
- js = “var q=document.documentElement.scrollTop=n” n为距离
driver.execute_script(js)
8.浏览器等待
显示等待(隔几秒扫描一次):
- from selenium.webdriver.support.ui import WebDriverWait
- WebDriverWait(driver, timeout, poll_frequency = 0.5, ignored_exception=None)
- WebDriverWait类是由WebDriver提供的方法,在设置时间内,默认每隔一段时间检测一次当前元素是否存在,如果超过设置时间检测不到则抛出异常。
- 显式等待就是在设置的时间之内,要等到满足某个元素的某个条件,该条件满足后就往下执行代码,如果超出设置的时间还没满足条件,那么就抛出Exception
隐式等待(相当于sleep):
- driver.implicitly_wait(n) #n为等待时间
9.cookies操作
网站为了辨别用户身份、进行会话保持而存储在本地终端上的数据(通常经过加密);http为无状态协议,不对之前的访问状态做管理,也就是说无法根据之前的登录状态进行本次访问的处理。
- get_cookies() #获取所有的cookies
- get_cookie() #获取key对应的值
- add_cookies(cookie_dict) #设置cookies
- delete_cookie(name) #删除指定名称的cookie
- delete_all_cookies() #删除所有cookie
10.封装
from selenium import webdriver
import time
class Common(object):
#初始化
def _init_(self):
#创建浏览器
self.driver = webdriver.Firefox()
#浏览器最大化
self.driver.maximize_window()
def open_url(self, url):
self.driver.get(url)
self.driver.implicatly_wait(10)
def locateElement(self, locate_type, value):
el = None
if locate_type == 'id':
el = self.driver.find_element_by_id(value)
elif locate_type = 'name':
el = self.driver.find_element_by_name(value)
elif locate_type = 'class':
el = self.driver.find_element_by_class_name(value)
elif locate_type = 'tag':
el = self.driver.find_element_by_tag_name(value)
elif locate_type = 'text':
el = self.driver.find_element_by_link_text(value)
elif locate_type = 'partial':
el = self.driver.find_element_by_partial_link_text(value)
elif locate_type = 'xpath':
el = self.driver.find_element_by_xpath(value)
elif locate_type = 'css':
el = self.driver.find_element_by_css_selector(value)
# 返回定义到的元素
if el:
return el
def click(self, locate_type, value):
el = self.locateElement(locate_type, value)
el.click()
def input_data(self, locate_type, value, data):
el = self.locateElement(locate_type, value)
el.send_keys(data)
# 获取定位到的元素中的文本内容<a>xxx</a>
def get_text(self, locate_type, value):
el = self.locateElement(locate_type, value)
return el.text
# 获取定位到的元素中的标签属性
def get_att(self, locate_type, value):
el = self.locateElement(locate_type, value)
return el.get_attribute(data)
#结束的时候清理了
def _del_(self):
time.sleep(3)
self.driver.quit()