目录
什么是自动化测试
单元测试
接口自动化测试
UI自动化测试
selenium介绍
webdriver API
元素的定位
操作测试对象
添加等待
打印信息
对浏览器的操作
键盘事件
鼠标事件
自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。
自动化测试包括UI自动化,接口自动化,单元测试自动化。
最大的投入应该在单元测试上,单元测试运行的频率也更加高。java的单元测试框架是Junit。
接口测试就是API测试,相对于UI自动化API自动化更加容易实现,执行起来也更稳定。
接口自动化测试的特点:
- 可在产品前期,接口完成后介入
- 用例维护量小
- 适合接口变动较小,界面变动频繁的项目
UI自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。
UI自动化测试的特点:
- 用例维护量大
- 页面相关性强,必须后期项目页面开发完成后介入
- UI测试适合与界面变动较小的项目
UI自动化的好处:
- 减少人为出错的几率,创建一个可靠的测试过程
- 可以进行繁琐的测试(比如测试过程一致,每次输入数据不同,ddt)
- 可以进行大量重复的测试,回归测试
- 可以节省人力资源
- 脚本的复用性
- 可以进行手工测试很难执行的测试(精准计时)
Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。
现在我们说起selenium,一般指的是Selenium2.0。它有由Selenium IDE,Webdriver,Selenium Grid组成。
首先看一个简单是自动化测试脚本
# coding = utf-8 //防止乱码,在编辑器里面可以不用加,因为编辑器默认的就是UTF-8模式。
from selenium import webdriver //导入webdriver工具包,这样就可以使用里面的API
import time
browser = webdriver.Firefox()
//获得被控制浏览器的驱动,这里是获得Firefox的,当然还可以获得Chrome浏览器,不过要想使这一段代码有效,必须安装相应的浏览器驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
browser.find_element_by_id("kw").send_keys("selenium")
//通过元素的ID定位想要操作的元素,并且向元素输入相应的文本内容 。
time.sleep(3)
browser.find_element_by_id("su").click()
//通过元素的ID定位到元素,并进行点击操作。
browser.quit() //退出并关闭窗口
注:browser.close()也可以关闭窗口。两者的区别是:close方法关闭当前的浏览器窗口,quit方法不仅关闭窗口,还会彻底的退出webdriver,释放与driverserver之间的连接。所以简单来说quit是更加彻底的close,quit会更好的释放资源。
原则:不管用什么方式定位,这个方式必须全局唯一
常用的定位元素的方法有:
- id 如果存在,可以全局唯一定位一个元素
- name 存在并且全局唯一才可以定位到
- class name 存在并且全局唯一才可以定位到
- link text 必须是链接,且链接内容全局唯一,才可以定位到
- partial link text 必须是链接,且链接内容全局唯一,才可以定位到(链接的部分内容就可以)
- tag name 必须全局唯一才可以定位到(标签名)
- xpath 任何一个元素都可以定位到(右键-copy-copyXpath)
- css selector (右键-copy-copyselector)
#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#########百度输入框的定位方式##########
#通过id 方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name 方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name 方式定位
browser.find_element_by_tag_name("input").send_keys("selenium") 不能成功,因为
input太多了不唯一。
#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS 方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xphan 方式定位
browser.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
#通过link_text 方式定位
browser.find_element_by_link_text("新闻").click()
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
webdriver 中比较常用的操作对象的方法有下面几个:
- send_keys() 向元素发送信息
- click()点击元素
- submit()提交表单
- clear()清除元素的内容
- text 获取元素的内容
固定等待 sleep()
我们需要引入time包,固定等待必须等够括号中的时间
import time time.sleep(3)
智能等待
通过implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait()的用法比time.sleep()
更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。browser.implicitly_wait(30) //智能等待30秒
打印title
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.title) # 把页面title 打印出来
打印URL
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.current_url) #打印url
浏览器最大化
browser.maximize_window()
设置浏览器宽和高
browser.set_window_size(width, high) //数字为像素点
操作浏览器前进、后退
#浏览器的前进
browser.forward()
#浏览器的后退
browser.back()
控制浏览器滚动条
#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
要使用键盘按键,必须引入keys 包:
from selenium.webdriver.common.keys import Keys通过send_keys()调用按键:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
send_keys(Keys.SPACE) #空格键
send_keys(Keys.ESCAPE) #回退键(Esc)
......
键盘组合键用法
send_keys(Keys.CONTROL,'a') #全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') #复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') #剪贴(Ctrl+X)
send_keys(Keys.CONTROL,'v') #粘贴(Ctrl+V)
要使用鼠标事件需要导入工具包:
from selenium.webdriver.common.action_chains import ActionChains#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Chrome() driver.get("http://news.baidu.com") qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']") ActionChains(driver).context_click(qqq).perform() #右键 ActionChains(driver).double_click(qqq).perform() #双击 #定位元素的原位置 element = driver.find_element_by_id("s_btn_wr") #定位元素要移动到的目标位置 target = driver.find_element_by_class_name("btn") #执行元素的移动操作 ActionChains(driver).drag_and_drop(element, target).perform()