1.什么是自动化测试?
在预设的条件(自动化脚本)下运行系统,预设的条件包括正常的和异常的情况,不需要手工干涉,机器就可以执行。
金字塔越往下效率越高,因为测试的往下是内核的东西
所以要把主要的精力放在单元测试的自动化
单元测试:
对程序最小的单元模块进行测试
java的单元测试框架是Junit //自己学习
接口测试:
测试时间段:在项目前期接口开发而成就可以开始进行测试
用例维护量比较少(与UI测试比较)
适合的项目:接口变动较少的项目
UI自动化
对系统的界面元素进行操作,模拟用户的使用,完成功能的正常和异常测试。
测试时间段:项目后期,项目完成前后端的开发和联调后‘
用例维护量:比较大
适合的项目:适合界面元素变动小的项目
2.UI自动化的好处
(1) 进行大量重复的测试,进行回归测试
(2) 减少人为出错的几率,创建一个可靠的测试过程
(3) 可以进行繁琐的测试。(比如测试过程一致,每次输入的数据不同,ddt)
(4) 进行手工测试很难执行的测试。(精准计时)
(5) 节省资源(人力资源)
(6) 脚本的复用性(脚本复用性越大,价值越高)
3.自动化框架
RoBotFramework 关键字驱动,底层实现语言Python。
Django 接口 Python
selenium unittests Python
4.为什么选择selenium?
免费,小巧,容易安装
支持多语言:java C# ruby JavaScript Python
支持多平台:Chrome Firefox edge Opera Safari
支持多浏览器多平台的好处?
可以进行兼容性测试
支持分布式测试:selenium Grid
4.webdriver的原理
(1)运行脚本,把浏览器绑定到一个端口,这个端口就是浏览器的remote server
(2)脚本通过commandexecutor,向浏览器发送HTTP请求,控制浏览器进行一系列操作
(3)浏览器驱动把指令解析成web service的命令,驱动浏览器进行一系列的操作
5.selenium IDE
录制自动化脚本的工具 1.简单的自动化测试录制(但是不常用)
点击第一个,创建一个工程
点击START RECORDING
搜索王心凌之后停止
这就是简单的录制
6.webdriver的原理
7.第一个脚本
打开百度搜索selenium
8.写脚本
(1)定位元素的方式(原则:必须全局唯一)(问:定位元素的方式有哪些)
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://www.baidu.com/") time.sleep(3) #通过id来定位,全局唯一,可以唯一定位一个元素 #driver.find_element_by_id("kw").send_keys("迪丽热巴") #time.sleep(3) #driver.find_element_by_id("su").click() #通过name来定位,name又能不全局唯一 #driver.find_element_by_name("wd").send_keys("赵盼儿") #driver.find_element_by_id("su").click() #tag_name定位 #driver.find_element_by_tag_name("input").send_keys("孙二娘") #driver.find_element_by_tag_name("input").click() #class name #driver.find_element_by_class_name("s_ipt").send_keys("孙二娘") #下面这个会失败,要用id定位 #driver.find_element_by_class_name("btn self-btn bg s_btn").click() #link text #driver.find_element_by_link_text("hao123").click() #partial link text #driver.find_element_by_partial_link_text("123").click() #xpath 任何元素都可以定位 #driver.find_element_by_xpath("//*[@id='kw']").send_keys("赵盼儿") #driver.find_element_by_xpath("//*[@id='su']").click() driver.find_element_by_css_selector("#kw").send_keys("双笙") driver.find_element_by_css_selector("#su").click() time.sleep(5) driver.quit()
(2)操作测试对象
a.send_keys() 向元素发送消息
b.click() 点击元素
c.submit() 提交表单
d.clear() 清除元素内容
(3)添加等待
a.sleep休眠(固定休眠)(必须等够括号里规定的时间)
需要导入time包,就可以在脚本中自由添加休眠时间了,这里的休眠指固定休眠
注意,当页面中的元素没有加载出来的时候,无法定位到元素
所以需要等待,如果不等待,就会出错
b.隐式等待(只要等待页面上的元素加载出来就立刻去执行下一条指令)
driver.implicitly_wait(10)等10秒之后元素还没有加载出来,就会报错
(4)信息打印
a.打印title
b.打印URL
(5)对浏览器的操作
a.浏览器的最大化
b.设置浏览器的宽和高
c.浏览器的前进
d.浏览器的后退
e.浏览器滚动条的控制(必须由javascript控制)
把滚动条拉到最低端
js0 ="var q =document.documentElement.scrollTop=10000" driver.execute_script(js0)把滚动条拉到最顶端
js1 ="var q =document.documentElement.scrollTop=0" driver.execute_script(js1)
6. 键盘事件(所有的键盘操作必须建立在定位带元素的基础上)
导入工具包
from selenium.webdriver.common.keys import keys
Keys.TAB
Keys.ENTER
组合键:
导入工具包
from selenium.webdriver.common.action_chains import ActionChains
全选: driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
剪贴: driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
右击和双击的前提是先定位元素
右击:ActionChains(driver).context_click(b).perform()
双击:(和点击的效果是一样的):ActionChains(driver).double_click(b).perform
上述全部代码如下:
from idlelib import browser from selenium import webdriver import time from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("https://www.baidu.com/") time.sleep(5) #通过id来定位,全局唯一,可以唯一定位一个元素 #driver.find_element_by_id("kw").send_keys("迪丽热巴") #time.sleep(3) #driver.find_element_by_id("su").click() #通过name来定位,name又能不全局唯一 #driver.find_element_by_name("wd").send_keys("赵盼儿") #driver.find_element_by_id("su").click() #tag_name定位 #driver.find_element_by_tag_name("input").send_keys("孙二娘") #driver.find_element_by_tag_name("input").click() #class name #driver.find_element_by_class_name("s_ipt").send_keys("孙二娘") #下面这个会失败,要用id定位 #driver.find_element_by_class_name("btn self-btn bg s_btn").click() #link text #driver.find_element_by_link_text("hao123").click() #partial link text #driver.find_element_by_partial_link_text("123").click() #xpath 任何元素都可以定位 #driver.find_element_by_xpath("//*[@id='kw']").send_keys("赵盼儿") #driver.find_element_by_xpath("//*[@id='su']").click() #driver.find_element_by_css_selector("#kw").send_keys("双笙") #driver.find_element_by_css_selector("#su").click() #driver.maximize_window() #获取文本信息,把内容赋给变量,获取元素上的内容 #text =driver.find_element_by_id("bottom_layer").text #print(text) #先搜索李易峰 #driver.find_element_by_css_selector("#kw").send_keys("李易峰") #driver.find_element_by_css_selector("#su").submit() #固定等待 #time.sleep(10) #智能等待 #driver.implicitly_wait(10) #driver.find_element_by_link_text("百度百科").click() #driver.find_element_by_id("kw").clear() #信息打印 #title=driver.title #print(title) #url=driver.current_url #print(url) #driver.quit() #对浏览器操作,浏览器的最大化 #driver.find_element_by_id("kw").send_keys("王牌部队") #driver.find_element_by_id("su").click() #time.sleep(4) #driver.set_window_size(400,1000) #time.sleep(3) #driver.maximize_window() #time.sleep(8) ##浏览器的前讲和后退 #browser.forword() #time.sleep(8) #browser.back() #ime.sleep(8) #浏览器的滚动条的控制 #js0 ="var q =document.documentElement.scrollTop=10000" #driver.execute_script(js0) #time.sleep(3) #js1 ="var q =document.documentElement.scrollTop=0" #driver.execute_script(js1) #time.sleep(8) #driver.quit() #driver.maximize_window() #driver.find_element_by_id("kw").send_keys("元旦快乐") #driver.find_element_by_id("su").click() #b=driver.find_element_by_id("su") #time.sleep(5) #然后再用剪切的方式clear掉文本框中的输入内容 #driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') #time.sleep(3) #driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') #time.sleep(3) #双击 driver.maximize_window() driver.find_element_by_id("kw").send_keys("元旦快乐") driver.find_element_by_id("su").click() b=driver.find_element_by_id("su") #双击 #ActionChains(driver).double_click(b).perform #右击 ActionChains(driver).context_click(b).perform() time.sleep(5)