自动化测试
自动化测试是指软件测试的自动化,再预设的状态下运行应用程序或者系统,预设条件下包括正常和异常,最后评估运行结果,将认为驱动的测试行为转化为机器执行的过程。
- 常见的自动化测试工具有:QTP、selenium、Rational Robot、jmeter、appium、Loadrunner等等。
我们经常使用selenium工具帮助我们完成自动测试,相比起其他工具,它有着不少的优势。这篇博客总结了selenium工具使用相关的一些知识,一起来看看吧~
selenium工具
特点
- 是一款轻量级、免费的工具;
- 它支持多平台:Windows、Mac、Linux;
- 它支持多浏览器:Chorme、IE edge、Firefox;
- 支持分布式测试用例的执行,可以将测试用例分布到不同的测试机器中执行;
- 支持多语言,这对于测试人员是非常有利的,不论更加熟悉什么语言,都可以通过selenium来进行实现。
版本
- selenium1.0:selenium IDE,selenium RC,selenium grid;
- selenium2.0:Webdriver;
- selenium3.0:增加了一些浏览器的原生驱动,Firefox edge;
我们使用selenium工具一般会进行录制脚本或者自己去编写需要的脚本让它完成自动化的测试
Webdriver常用的API
这里我们先来了解一下脚本到底长什么样子:
from selenium import webdriver
import time
browser = webdriver.Firefox()
time.sleep(3)
broswer.get("http://www.baidu.com")
time.sleep(3)
broswer.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
broswer.find_element_by_id("su").click()
broswer.quit()
- 首先,如果想要使用selenium的webdriver里的函数,需要先将包导入
from selenium import webdriver
- 指定需要操控的浏览器
browser = webdriver.Firefox()
- 进行定位
broswer.find_element_by_id(“kw”).send_keys(“selenium”)
- 我们在进行搜索时输入要搜索的内容紧接着就要点击按钮才能完成查询跳转到查询的界面
broswer.find_element_by_id(“su”).click()
- 关闭
broswer.quit() //退出并关闭窗口的每一个相关的驱动程序
broswer.close() //关闭当前窗口
quit不仅可以关闭窗口,还可以更好的释放资源
元素的定位
在我们进行自动化测试时,对象的定位是我们操作的核心,因为我们要想识别一个对象,就应该识别该对象。我们可以通过对象的属性找到该对象。
注意:不论我们采用哪种方式进行元素的定位,都必须保证属性是存在且唯一的。
我们常用的方法有:
- id
- name
- class name
- link text
- partial link text
- targe name
- xpath
- css selector
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
#最大化浏览器
driver.maximize_window()
time.sleep(6)
#1 用id来进行定位
driver.find_element_by_id("kw").send_keys("张杰")
driver.find_element_by_id("su").click()
#2 用name来进行定位
driver.find_element_by_name("wd").send_keys(u"张杰")
driver.find_element_by_id("su").click()
#3 用 class name来进行定位
driver.find_element_by_class_name("bg s_ipt_wr quickdelete-wrap").send_keys("张杰")
driver.find_element_by_class_name("bg s_btn btn_h btnhover").click()
#4 用tag name 来进行定位(input 太多了不能定位到)
driver.find_element_by_tag_name("input").send_keys("张杰")
driver.find_element_by_id("su").click()
#5 Link text
driver.find_element_by_link_text("视频").click()
#6 partial link text 链接的一部分
driver.find_element_by_partial_link_text("视") .click()
#6 Xpath定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("张杰")
driver.find_element_by_xpath("//*[@id='su']").click()
#7 CSS selector定位
driver.find_elements_by_css_selector("#kw").send_keys("张杰")
driver.find_elements_by_css_selector("#su").click
time.sleep(6)
driver.quit()
操作测试对象
在我们完成对元素的定位操作后,还需要对元素进行操作,是鼠标点击还是进行键盘输入,要取决于定位的是按钮还是输入框。
我们一般常用的操作方法有如下几个:
- click:点击对象
- send_keys:在对象上模拟按键输入
- clear:清除对象的内容
- submit:提交查询内容
- text:用于获取元素的文本信息
#清除搜索内容“张杰”
driver.find_element_by_name("wd").clear()
#重新搜索"毛不易"
driver.find_element_by_name("wd").send_keys(u"毛不易")
#提交查询内容
driver.find_elment_by_id("su").submit()
#输出信息
text = driver.find_element_by_id("bottom_layer").text
print("text = "+text)
输出结果会直接显示出
添加等待
- 固定等待
time.sleep()
使用场景:如果必须要等待固定的秒数,就用固定等待
- 智能等待
implicity_wait()
使用场景:需要等待下一个元素加载出来就会立马执行相应的操作;
我们怎样去区分这两种等待呢?
小明和小红约定好了一起去看电影,到了规定的时间,可是小红还没到,小明就会再一个地方固定等待一段时间(假设等待10min),
那么固定等待就是小明一定会在规定的地方等待小红10min,不管是小红在第5分钟还是第9分钟到达,小明还是会等待10min;(相当于一个设定的程序,必须完成规定的事情)
智能等待就是,当小红提前到了,小明就和小红直接去看电影了不会继续等待,如果等待了10分钟小红还没有到,那么就会抛出异常;
打印信息
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
#打印title
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("隐秘的角落")
driver.find_element_by_id("su").submit()
time.sleep(5)
title = driver.title;
print("title = "+title)
#打印当前的URL
url = driver.current_url
print("url = "+url)
time.sleep(6)
driver.quit()
对浏览器的操作
- 放大
- 缩小
- 设置浏览器的宽和高
- 设置前进和后退
- 控制浏览器的滚动条
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys(u"张杰")
driver.find_element_by_id("su").click()
#浏览器的最大化
driver.maximize_window()
time.sleep(3)
#浏览器的最小化
driver.minimize_window()
time.sleep(3)
#设置浏览器宽高
driver.set_windows_size(400, 800)
time.sleep(3)
#浏览器的后退
driver.back()
time.sleep(3)
#浏览器的前进
driver.forward()
time.sleep(3)
#将浏览器的滚动条放到最底端
js = "var q=document.documentElment.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将浏览器的滚动条放到最底端
js1 = "var q=document.documentElment.scrollTop=0"
driver.execute_script(js1)
time.sleep(3)
driver.quit()
键盘
键盘按键用法
这里以禅道的登陆页面进行测试
使用时需要将它的包导入
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import os
import time
import os
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:88/pro/user-login.html")
#最大化浏览器
driver.maximize_window()
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
time.sleep(6)
driver.find_element_by_name("password").send_keys("123")
#用ENTER键进行登录
driver.find_element_by_name("password").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()
键盘组合键的用法
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys(u"张杰")
driver.find_element_by_id("su").click()
#键盘组合键的用法
#复制
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(5)
#剪贴
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(5)
driver.find_element_by_id("kw").send_keys("乘风破浪的姐姐2")
driver.find_element_by_id("su").click()
time.sleep(5)
鼠标事件
ActionChains
类
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 移动
我们在使用这类时
也需要将它的包导入
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains
import os
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("张杰")
#定位“百度一下”按钮
su1 = driver.find_element_by_id("su")
#右击
ActionChains(driver).context_click(su1).perform()
#双击
time.sleep(5)
ActionChains(driver).double_click(su1).perform()
time.sleep(5)
title = driver.find_element_by_id("su")
target = driver.find_element_by_link_text("张杰_百度百科")
#拖动
ActionChains(driver).drag_and_drop(title, target).perform()
#移动
ActionChains(driver).move_to_element(target).perform()
time.sleep(5)
driver.quit()
定位一组元素
inputs = driver.find_elements_by_tag_name("input")
for input in inputs:
if input.get_attribute("type")=="checkbox":
input.click()
多层框架/窗口定位
定位:
- switch_to_frame()
- switch_fo_window()
#从默认的页面跳转到id=f2的页面
driver.switch_to.frame("f1")
driver.switch_to.frame("f2")
driver.find_element_by_id("kw").send_keys(u"西雅图")
driver.find_element_by_id("su").submit()
time.sleep(6)
#跳转到默认的页面
driver.switch_to.default_content()
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()
time.sleep(5)
driver.quit()
层级定位
level_locate.html
下拉框处理
#定位一组元素
options = driver.find_elements_by_tag_name("option")
for option in options:
if option.get_attribute("value")=="9.03":
option.click()
alter
driver.find_elements_by_id("tooip").click()
time.sleep(5)
#得到操作句柄
alert = driver.switch_to.alert
#关闭alert框
alert.accept()
转载:https://blog.csdn.net/qq_44851228/article/details/115833961