自动化
作用:多用于回归测试,用代码执行重复的工作
工具:
Python + selenium(框架) + unittest + HtmlTestRunner
selenium:web测试框架,封装了各大浏览器驱动的api
unittest:单元测试框架,加载所有用例,执行
HtmlTestRunner:生成Html格式测试报告
类别:
接口自动化
web自动化
app自动化
web自动化:
元素定位:
id定位 id=kw
name定位 name=wd
class定位 class=s_ipt
link_text定位 文本定位
tag_name定位 标签定位
xpath定位:
// 相对路径
/ 绝对路径
. 当前节点
contains:包含 "//a[contains(@id,‘kw‘)]"
starts-with 元素以什么开头 ‘//input[starts-with(@name,‘w‘)]‘
浏览器操作:
最大化浏览器 d.maximize_window()
关闭当前句柄所对应的窗口 d.close()
退出 浏览器并结束cheomedriver进程 d.quit()
打开url d.get()
获取当前页面title d.title
浏览器前进 d.forward()
浏览器后退 d.back()
浏览器刷新 d.refresh()
获取当前页面的url d.current_url
获取浏览器名称 d.name
截屏 d.get_screenshot_as_file("")
页面元素对象操作:
click() 点击
send_keys(str) 输入
tag_name 获取标签名
text 获取标签文本
clear 清空对象内容
get_attribute(属性) 获取元素对象的属性
is_displayed() 判断页面元素是否可见,返回布尔值
框架切换:
d.switch_to.frame("")
d.switch_to.default_content()
句柄切换:
a.switch_to.window(a.window_handles)
等待时间:
强制等待
time.sleep(秒数)
隐性等待
implicitly_wait(秒数) 在规定时间内等待页面所有元素加载完成,超过所设定的秒数则报错
显性等待
b=WebDriverWait(webdriver,timeout,频率)
b.unti(函数,message="")
until内部会执行传入的函数,会在所设定的时间内按设定的频率进行检测元素是否被加载,若加载,则定位,否则报错
键盘事件:
导入from selenium.webdriver.config.keys import Keys
通过selenium模拟键盘操作
模拟全选:
c=wait.until(lambda x:x.find_element_by_id(‘kw‘))
c.send_keys("游戏人生")
c.send_keys(Keys.CONTROL,"a")
模拟回车:
c=wait.until(lambda x:x.find_element_by_id(‘su‘))
c.send_keys("游戏人生")
c.send_keys(Keys.ENTER)
鼠标事件:
导入 from selenium.webdrive.config.action_chains import ActionChains
鼠标双击:
b=a.find_element_by_id("kw")
b.send_keys("游戏人生")
ActionChains(a).double_click(b).perform()
鼠标移动:
b=a.find_element_by_xpath(‘//*[@id="u1"]/a[8]‘)
time.sleep(1)
ActionChains(a).move_to_element(b).perform()
鼠标右键:
b=a.find_element_by_id("kw")
b.send_keys("游戏人生")
ActionChains(a).context_click(b).perform()
下拉框定位:
b.find_element_by_xpath(‘//*[@id="nr"]/option[2]‘).click()
弹窗:
定位弹窗:a.find_element_by_xpath(‘//*[@id="gxszButton"]/a[1]‘).click()
接收弹窗:c=a.switch_to.alert
接收警告信息:c.accept()
对弹窗内的对话框输入内容:c.send_keys()
取消弹窗:c.dismiss()
滚动条滑动:
坐标滑动:
js="document.documentElement.scrollTop=800"
a.execute_script(js)
元素定位滑动:
b=a.find_element_by_xpath(‘//*[@id="6"]/h3/a‘)
c="arguments[0].scrollIntoView();"
a.execute_script(c,b)
文件上传:
定位、上传
a.find_element_by_xpath(‘//*[@id="form"]/span[1]/span‘).click()
time.sleep(1)
a.find_element_by_xpath(‘//*[@id="form"]/div/div[2]/div[2]/input‘) .send_keys(r‘C:\Users\Administrator\Pictures\2014121211164481.jpg‘)
获取一组元素:
通过elements,先定位,再循环
a.find_element_by_xpath(‘//*[@id="show-answer-hide"]‘).click()
time.sleep(2)
li=a.find_elements_by_xpath(‘//i[@class="ikonw-qb-new-icon icon-evaluate "]‘)
for i in li:
i.click()
ec模块(expected_conditions):
* ec.visibility_of_element_located(()):
元素可见,再执行定位,接收元祖,和显性等待结合使用
b=wait.until(ec.visibility_of_element_located(("id","kw")))
b.send_keys("游戏人生")
* ec.presence_of_element_located(()):
判断元素是否加载到DOM树,和显性等待结合使用
b=wait.until(ec.presence_of_element_located(("id","su")))
b.click()
ec.text_to_be_present_in_element(()):
判断标签的文本信息是否与传入的文本一致,返回布尔值
b=wait.until(ec.text_to_be_present_in_element(("link text","地图"),"地图"))
print(b)
ec.text_to_be_present_in_element_value(()):
判断标签的value属性是否与传入的文本相等,返回布尔值
b=wait.until(ec.text_to_be_present_in_element_value(("id","kw"),"游戏人生"))
print(b)
* ec.alert_is_present()(a):
判断页面是否存在弹窗,如果存在,直接切入弹窗,不存在,返回False
b=ec.alert_is_present()(a)
print(b)
ec.title_is():
获取页面标题,判断与传入的标题是否相等,返回布尔值
b=wait.until(ec.title_is("百度一下,你就知道"))
print(b)
* ec.frame_to_be_available_and_switch_to_it(()):
判断框架是否可以切入,能则切入框架,否则返回False
b=ec.frame_to_be_available_and_switch_to_it(("xpath","pa"))(a)
print(b)
类的装饰器:
装饰器=高阶函数 + 函数闭包+语法糖
作用:在不修改函数的调用方式的前提下,给函数怎加新功能,不修改函数的源码
@classmethod:
将类的函数属性声明为类属性,不能直接访问实例属性
@staticmethod:
将类的函数属性声明为静态属性,不能直接访问类的静态属性和函数属性以及实例属性
@property:
将类的函数属性声明为property后,调用不加括号
unittest(单元测试)框架:
继承测试类后,用例必须以test开头
导入from unittest import TestCase
class MyTest(TestCase):
@classmethod
#整个测试类启动时,先执行setUpClass,只执行一次
def setUpClass(cls):
pass
# 每个用例执行前,先执行setUp
def setUp(self):
pass
# 每个用例执行后,执行tearDown
def tearDown(self):
pass
@classmethod
# 整个测试类结束时,先执行tearDownClass,只执行一次
def tearDownClass(cls):
pass
def test_01(self):
# 判断预期结果与实际结果是否相等,不相等则抛出错误,用例执行失败
self.assertEqual("预期结果","实际结果")
#判断预期结果与实际结果是否不相等,相等则抛出错误,用例执行失败
self.assertNotEqual("预期结果","实际结果")
# 判断左边参数是否小于右边参数
self.assertLess(1,2)
# 判断实际结果是不是False
self.assertFalse(False)
PO模式:
对象层:
BasePage类封装了所有的selenium的操作(初始化、定义页面函数)
元素层:
封装页面元素 一个页面封装一个类
业务层:
业务层定义所有的类都要继承BasePage
业务层封装 项目所有业务流程
一个流程一个类
用例层:
用例层和数据、元素、业务分离
调用业务层函数,执行测试用例
原文地址:https://www.cnblogs.com/szwlycw/p/11544501.html