定义
按照设定好的条件步骤让电脑(机器)运行
需求变动频繁,项目周期短,人工交互强的项目无法做自动化测试
自动化测试分类
UI自动化:项目稳定、界面稳定、项目后期做UI自动化、用例维护量大
接口自动化:接口稳定、项目前期介入、用例维护量少
性能自动化
selenium工具集
selenium 1.0:thoughtworks? ? ? Jason?Hugguis? ? javascript? ? seleninm1.0
seleniumRC(已经被webdriver替代)、selenium IDE(自动化脚本录制工具)、selenium GRID(分布式测试)
selenium 2.0:selenium1.0 + webdriver(浏览器驱动,根据不同浏览器定制,绕过了JavaScript环境沙箱问题)
? ? ? ? ? ? ? ? ? ? ? ? ? webdriver工作原理:脚本把指令传达给webdriver,webdriver来根据指令驱动浏览器执行脚本中的命令? ? ? ? ? ? ? ? ? ? ??
selenium 3.0:? ?增加了一些浏览器的原生驱动。
简单脚本构成(四部分):
1.脚本头部导入需要的包
2.获取浏览器驱动
3.使用浏览器驱动对需要测试的文本系统进行测试
4.测试完关闭浏览器
常用API
定位
在定位时,需要注意:定位使用的字段必须唯一
- 使用 id 定位,id是全局唯一的
- 使用 name 定位
- 使用 classname 定位,classname属性易重复,不推荐使用?
- 使用 link text 、partial link text定位,若两链接一样则不能定位
- 使用 tag name 定位,借助标签定位且标签惟一
- 使用 xpath 定位,一定可以定位到元素
- 使用 ccs selector 定位
# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox() #获得火狐驱动
driver.get("https://www.baidu.com/") #打开浏览器
time.sleep(3)
#id的定位
driver.find_element_by_id("kw").send_keys("数据库")
driver.find_element_by_id("su").click()
#name的定位
driver.find_element_by_name("wd").send_keys("SQL")
driver.find_element_by_id("su").click()
#classname的定位
driver.find_element_by_class_name("s_ipt").send_keys("yamy")
driver.find_element_by_class_name("bg s_btn").click()
#link text的定位
driver.find_element_by_link_text("地图").click()
#partial link text的定位
driver.find_element_by_partial_link_text("高考").click()
#tag name的定位
driver.find_element_by_tag_name("input").send_keys("操作系统")
driver.find_element_by_id("su").click()
#xpath定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("操作系统")
driver.find_element_by_xpath("//*[@id='su']").click()
#css selector定位 (复制css选择器/copy selector)
driver.find_element_by_css_selector("#kw").send_keys("操作系统")
driver.find_element_by_css_selector("#su").click()
time.sleep(3)
# 关闭浏览器
driver.quit()
操作测试对象
- click() 点击对象
- send_keys() 模拟按键输入
- clear() 清除对象内容
- submit() 提交表单(如果页面源码中有submit属性(type = "submit"), 那就可以使用submit替换click)
- text() 获取元素文本信息
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://baidu.com/")
time.sleep(3)
# 浏览器最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("操作系统")
driver.find_element_by_id("su").submit()
time.sleep(3)
driver.find_element_by_id("kw").clear() #清除内容
driver.find_element_by_id("kw").send_keys("数据库")
#提交表单
driver.find_element_by_id("su").submit()
#获取元素文本信息
text = driver.find_element_by_id("s-bottom-layer-right").text print(text + " ")
time.sleep(3)
driver.quit()
添加等待
- 固定等待:time.sleep(X) 设置等待X秒中;
- 智能等待:implicitly_wait(X) 等待的时间是0~X秒;
打印信息(打印上一个页面的)
title = driver.title
print("title : " + title)
url = driver.current_url
print("url : " + url)
# 输出结果:
# title : 百度一下,你就知道
# url : https://www.baidu.com/
浏览器的操作
? ? ? ? ? driver.maximize_window()
? ? ? ? ? driver.minimize_window()
? ? ? ? ? driver.set_window_size(400, 800)
? ? ? ? ? ①将页面滚动条拖到最底端(10000)
? ? ? ? ? js="var q=document.documentElement.scrollTop = 10000"
? ? ? ? ?driver.execute_script(js)
? ? ? ? ? ②将页面滚动条拖到最顶端(0)
? ? ? ? ? js="var q=document.documentElement.scrollTop = 0"
? ? ? ? ?driver.execute_script(js)
? ? ? ? ?driver.back()
? ? ? ? ?.forward()
键盘事件
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
driver.find_element_by_id("u").send_keys("JY_8554")
# 用TAB键把光标移动到密码输入框
driver.find_element_by_id("u").send_keys(Keys.TAB)
time.sleep(6)
# 输入密码
driver.find_element_by_id("p").send_keys("yunjiayu")
# 回车登录
driver.find_element_by_id("p").send_keys(Keys.ENTER)
from selenium.webdriver.common.keys import Keys
#输入框输入内容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys("webdriver")
driver.find_element_by_id("su").click()
鼠标事件
ActionChains 类
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 移动
# 定位"百度一下"按钮
su1 = driver.find_element_by_id("su")
# 右击
ActionChains(driver).context_click(su1).perform()
# 双击
ActionChains(driver).double_click(su1).perform()
# 拖动
target = driver.find_element_by_id("su")
title = driver.find_element_by_css_selector("#\31 > h3 > a")
ActionChains(driver).drag_and_drop(title, target).perform()
# 移动
ActionChains(driver).move_to_element(target).perform()
定位一组元素
定为一组元素一般用于以下场景:
- 批量操作对象,比如将页面上所有的checkbox都勾选上
#coding=utf-8
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()
多层框架/窗口定位
- switch_to_frame()
- switch_to_window()
?多层窗口定位
下拉框处理
alert、confirm、prompt 的处理
- text 返回alert/confirm/prompt 中的文字信息
- accept 点击确认按钮
- dismiss 点击取消按钮,如果有的话
- send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错
- switch_to_alert()只能处理原生的alert?
unittest框架,是Python的单元测试框架
setUp() :初始化
tearDown() :清理工作
TestCase? :以test_ 开头,运行这个类时默认执行
测试套件:存放测试用例,测试方法的一个容器
addTest:一次存放一个测试脚本里一个类的一个方法,必须提供脚本名
|