测试技能之Selenium
1. 测试核心理论知识
1.1 软件开发生命周期
简介:讲解软件开发的生命周期
1、测试人员需要全程参与
需求调研-》需求分析评审-》软件架构设计-》编码-》单元测试-》集成测试-》系统测试-》预发布系统测试-》上线
- 测试人员要求开发人员写单元测试
- 把控时间点、风险点
- 接口文档不完善(更新了需求功能,不及时更新接口文档)
1.2 测试相关知识分类讲解
简介: 测试分类讲解
-
黑盒测试(功能测试):功能符合用户的需求:
-
白盒测试:知道里面的逻辑,验证符合用户的需求
-
冒烟测试:主功能、主路径测试
-
自动化测试: 人工测试转为工具自动执行(没有谁取代谁,有些场景适合自动化测试,有些场景适合手工测试)
-
性能测试:模拟多种峰值和负载去测试各项性能指标 jmeter、loadrunner
1.3 自动化测试和手工测试优缺点
简介:介绍什么时候需要用到自动化测试和什么时候用手工测试
- 1、自动化测试方便,自动验证功能是否有问题
- 2、更好的利用自有,节约人力成本
- 3、覆盖更全,增加软件的稳定性
场景:
软件需求变更少,项目周期长,稳定性要强,环境要隔离独立(开发一套环境、测试一套环境)
如果整个系统需求变更多,只能抽取部分功能做自动化测试,手工测试和自动化测试相辅相成,不是取代关系。
语言选择:
python java ,打造自己的唯一性
2. selenium实战之模拟事件处理
2.1 selenium之ActionChains模拟用户行为
简介:讲解使用selenium里面的ActionChains模拟用户的行为
-
需求:
需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽 -
解决:selenium提供了一个类来处理这类事件
selenium.webdriver.common.action_chains.ActionChains(driver)
-
脚本:
from selenium.webdriver.common.action_chains import ActionChains
-
执行原理:
调用ActionChains的方法时不会立即执行,会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的事件会依次执行
支持链式写法或者分步写法
ActionChains(driver).click(ele).perform()
-
鼠标和键盘方法列表:
perform() 执行链中的所有动作
click(on_element=None) 单击鼠标左键
context_click(on_element=None) 点击鼠标右键
double_click(on_element=None) 双击鼠标左键
move_to_element(to_element) 鼠标移动到某个元素
ele.send_keys(keys_to_send) 发送某个词到当前焦点的元素
========== 不常用 ==========
click_and_hold(on_element=None) 点击鼠标左键,不松开
release(on_element=None) 在某个元素位置松开鼠标左键
key_down(value, element=None) 按下某个键盘上的键
key_up(value, element=None) 松开某个键
drag_and_drop(source, target) 拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽到某个坐标然后松开
move_by_offset(xoffset, yoffset) 鼠标从当前位置移动到某个坐标
move_to_element_with_offset(to_element, xoffset, yoffset) 移动到距某个元素(左上角坐标)多少距离的位置
send_keys_to_element(element, keys_to_send) 发送某个键到指定元素
2.2 鼠标事件实战之hover菜单栏弹出
简介:鼠标事件之菜单栏hover弹出
-
1、引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains -
2、move_to_element(to_element) 鼠标移动到某个元素
#对定位到的元素执行鼠标移动到上面的操作
ActionChains(driver).move_to_element(ele1).perform()
-
3、多知识点综合实战之模拟用户登录
简介:讲解使用selenium模拟登录小D课堂,并选择课程
1、多知识点实战
2、查找登录框-》输入用户名和密码-》触发登录-》判断登录是否成功-》打印结果
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome() #拿到driver
driver.get("https://xdclass.net") #跳转指定网页
#定位鼠标移动到上边的元素
menu_ele = driver.find_element_by_css_selector("#app > div > div.main > div.banner.w > div.l_course_list > ul > li:nth-child(1)")
ActionChains(driver).move_to_element(menu_ele).perform()
#选中子菜单
sub_menu_ele = driver.find_element_by_css_selector("#app > div > div.main > div.banner.w > div.innerbox > div.base > div.sort > a:nth-child(1)")
sleep(2)
sub_menu_ele.click() #点击子菜单
点击后跳转界面
4、自动化测试实战之网页等待时间
简介:讲解自动化测试的等待时间
-
1、为什么需要等待时间–》等系统稳定
网页需要加载对应的资源文件,页面渲染,窗口处理等等 -
2、自动化测试常用的等待时间
强制等待 : (自己调试代码看效果)
from time import sleep
sleep(5) # 强制等待5秒再执行下一步,缺点是不管资源是不是完成,都必须等待隐性等待:
driver.implicitly_wait(10) # 隐性等待,最长等10秒
#设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步,弊端就是程序会一直等待整个页面加载完成,到浏览器标签栏那个加载圈不再转注意:对driver起作用,所以只要设置一次即可,没有必要到处设置
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome() #拿到 driver
driver.get("https://xdclass.net")
driver.implicitly_wait(10) #隐式等待,最长等待时间10s.
login_ele = driver.find_element_by_css_selector("#app > div > div.header > div > div.r_userinfo.f_r > div.login > span:nth-child(2)")
ActionChains(driver).click(login_ele).perform() #触发点击事件,显示登录框
driver.find_element_by_css_selector("#app > div > div.header > div.main > div.login > div > div.mobienum > input[type=text]").clear()
driver.find_element_by_css_selector("#app > div > div.header > div.main > div.login > div > div.mobienum > input[type=text]").send_keys("13180977920")
driver.find_element_by_css_selector("#app > div > div.header > div.main > div.login > div > div.psw > input[type=password]").clear()
driver.find_element_by_css_selector("#app > div > div.header > div.main > div.login > div > div.psw > input[type=password]").send_keys("dacidabei")
login_btn_ele = driver.find_element_by_css_selector("#app > div > div.header > div.main > div.login > div > div.login_btn > button")
login_btn_ele.click() #点击登录
#移动鼠标到弹窗
user_info_ele = driver.find_element_by_css_selector("#app > div > div.header > div > div.r_userinfo.f_r > div.avatar.f_r > img")
ActionChains(driver).move_to_element(user_info_ele).perform()
#获取用户名元素
user_name_ele = driver.find_element_by_css_selector("#app > div > div.header > div > div.userbox.f_r > div > div.user > p")
print("=========测试结果=============")
print(user_name_ele.text)
name = user_name_ele.text
if name == u'沧海一阳':
print("login ok!")
else:
print("login fail!")
- 显性等待:
WebDriverWait 需要配合 until和until_not,程序每隔N秒检查一次,如果成功,则执行下一步,否则继续等待,直到超过设置的最长时间
from selenium.webdriver.support.wait import WebDriverWait
语法:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#拿到diver
driver = webdriver.Chrome()
#driver.implicitly_wait(10) # 隐性等待,最长等10秒
#跳转网页
driver.get("https://baidu.com")
try:
#显性等待
ele = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID,"kw"))) #最大超时时间为5s,每隔0.5s刷新一次,直到找到网页上的element。
ele.send_keys("小D课堂")
print("资源加载成功")
print(driver.title)
except:
print("资源加载失败,发送报警邮件或者短信")
finally:
print("不管有没成功,都打印,用于资源清理")
#退出浏览器
driver.quit()
结论: 隐性等待和显性等待可以同时用,等待的最长时间取两者之中的较大者*
3. selenium干弹窗、取cookie与error截图
3.1 干弹窗
自动化测试之页面常见弹窗处理
简介:讲解使用selenium处理页面弹窗,alert和comfirm
- 弹窗常用方法(需要先切换窗口 switch_to_alert() )
- accept() 表示接受
- dismiss() 表示取消
alert.html:
<!DOCTYPE html>
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<input id = "alert" value = "alert" type = "button" onclick = "alert('alert 关注小D课堂');"/>
<input id = "confirm" value = "confirm" type = "button" onclick = "confirm('confirm 关注小D课堂');"/>
</body>
</html>
操作弹窗:
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
#拿到diver
driver = webdriver.Firefox()
#跳转网页
driver.get("file:/Mac/Home/Desktop/alert.html")
print(driver.title)
#睡眠时间3秒
sleep(2)
driver.find_element_by_id("alert").click()
#切换到弹窗
win = driver.switch_to_alert()
sleep(2)
win.accept()
driver.find_element_by_id("confirm").click()
#切换到弹窗
confirm_ele = driver.switch_to_alert()
sleep(2)
#confirm_ele.accept()
confirm_ele.dismiss()
3.2 取cookie
F12 后 点击Application,添加name和value
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
#拿到diver
driver = webdriver.Chrome()
#跳转网页
driver.get("https://xdclass.net")
print(driver.title)
#睡眠时间3秒
sleep(3)
driver.add_cookie({"name":"name","value":"jack"})
driver.add_cookie({"name":"token","value":"xdclasseyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwicm9sZXMiOiIxIiwiaW1nIjoiaHR0cHM6Ly94ZC12aWRlby1wYy1pbWcub3NzLWNuLWJlaWppbmcuYWxpeXVuY3MuY29tL3hkY2xhc3NfcHJvL2RlZmF1bHQvaGVhZF9pbWcvNy5qcGVnIiwiaWQiOjY3NDkxOSwibmFtZSI6Iuayp-a1t-S4gOmYsyIsImlhdCI6MTU5NTc3MjkxNiwiZXhwIjoxNTk2Mzc3NzE2fQ.tAElec9ZkGhn5e3sNBYoJHrUU8Bn68le_Oa13H08GoY"})
video_ele = driver.find_element_by_css_selector("#app > div > div.new > div > div.content > div.l_content > a:nth-child(2) > div > h1")
video_ele.click()
sleep(2)
driver.get("https://xdclass.net/#/payconfirm?video_id=52")
3.3 Error截图
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
#拿到diver
driver = webdriver.Firefox()
#跳转网页
driver.get("https://xdclass.net")
print(driver.title)
#睡眠时间3秒
sleep(3)
#登录框
login_ele = driver.find_element_by_css_selector("#login")
#触发点击事件
ActionChains(driver).click(login_ele).perform()
#捕捉找不到元素异常
try:
driver.find_element_by_id("xdclass").click()
except:
driver.get_screenshot_as_file("./error_png.png")