安装环境:python+Chrome
Selenium Web Ui自动化测试
适合自动化测试的情况:需求不会频繁更改,Ui比较稳定,项目周期较长,大量回归测试任务
不适合做自动化测试的情况:音频、视频(主要是交互式的情况)
冒烟测试:测试核心功能,再开始进行正式测试
回归测试:版本迭代,对之前版本的功能进行验证
定义:
环境搭建:python 3.7+selenium 3+Chrome
Unittest框架,生成测试报告
• UI自动化的本质
定位元素:鼠标定位到输入框
操作元素:搜索、查询
模拟页面元素
断言结果:看实际结果与预期结果是否匹配(检查点)
生成报告:测试结果报告
• Ui自动化测试设计原则
一个case完成一个功能点测试;
一个脚本是一个完成的场景;(比如登陆界面)
脚本之间独立,不能有依赖;(进行封装)
设置合适的检查点;
设计良好的框架
• Selenium的特点
定义:Selenium主要用于Web应用程序的自动化测试,还支持所有基于Web的管理任务自动化。不是一个单独的工具,是由一些插件、类库组成,每个部分都有其特点和应用场景。
特点:
⁃ 开源、免费
⁃ 多浏览器支持: FireFox,Chrome,IE,Edge;
⁃ 多平台支持:Linux,Windows,MAC;
⁃ 多语言支持:Java,Python,Ruby,C#,JavaScript,C++;
⁃ 对Web页面有良好的支持;
⁃ 简单(API简单)、灵活(用开发语言驱动)
Selenium 3.x 去掉了Selenium RC,使用Webdriver,可直接操作浏览器
• 常用的元素定位工具介绍
鼠标点击—》查看元素
• 常用API介绍
• 八大定位方式(只能定位到地址栏以下的部分)
1⃣️driver.find_element_by_id
⁃ id就是一种方式,通过id查找的,这个id的具体属性值
2⃣️driver.find_element_by_name
⁃ 通过name定位
3⃣️driver.find_element_by_xpath
⁃ 万能定位,按照绝对路径(从根结点开始)/相对路径,层层分级的找
1、定位路径操作步骤:打开页面—》鼠标右击、选择检查—〉按Ctrl+F键(显示路径框)—》填写路径—》/html/body/div/div/div/div/form/input[1]
(有两个input,加一个索引值,确定的页面程序会高亮)—》在写入程序
2、相对路径:根据定位目标的特有属性直接定位(方便、用的多)
//input[@placeholder=‘请输入你要查找的关键字’]
//input[@type=‘text’and@name=‘key’and@class=‘but1’]
3、包含关系://input[contains(@placeholder,’查找的关’)]
4、可以直接鼠标点击定位,然后鼠标右键选择复制xpath的路径(不推荐,系统定位方式不准确)
4⃣️driver.find_element_by_css_selector
原理同xpath,也有绝对路径和相对路径,写法不同
绝对路径:html div>div div>div>form>input(’’空格’’或者’’>’’分层级)
⁃ 相对路径:
⁃ 具备id属性:#cart_num
⁃ 具备class属性:input.but1/.but1
⁃ 其他方式:input[placeholder=‘请输入你要查找的关键字’]
input[class=‘but1’][type=‘submit’]
子索引:div.schbox>input:nth-child(2)(按照scbox 下子序列的排序,排在2位置上的值)
5⃣️driver.find_element_by_link_text
⁃ 跳转链接(a标签,href跟链接地址)
6⃣️driver.find_element_by_partial_link_text
⁃ partial:表明只需要输入部分连续的文案(⚠️输入的简单文案不和其他跳转文案相同,不然会发生冲突)
7⃣️driver.find_element_by_class_name
⁃ 通过class属性定位
8⃣️driver.find_element_by_tag_name
• 获取验证信息(地址栏之上的部分)
页面名称:title=driver.title
url(当前页面的具体地址):url=driver.current_url
刷新:driver.refresh()
后退:driver.back()
前进:driver.forward()
退出页面:driver.quit()
页面布局的大小:set_window_size(1200,800)
页面最大化:driver.maximize_window()
定位后进行输入:定位目标.sendkey(“. ”)
定位后清空输入框内容:定位目标. clear()
定位点击: 定位目标.click()
获取控件尺寸:定位目标.size/.size[‘height’]
获取控件文本:定位目标.text
获取控件属性值:定位目标.get_attribute(‘href’)
显示:目标定位.is_displayed() (布尔类型)
• 模拟鼠标:
需导入鼠标事件的类:
from selenium.webdriver.common.action_chains import ActionChains
鼠标移到某处没有点击情况下,然后显示该控件的所有子列表
ele=driver.find_element_by_link_text(‘男装女装’)
鼠标移动:ActionChains(driver).move_to_element(ele).perform()
鼠标右击:ActionChains(driver).context_click(ele).perform() (没有这一模块的左击)
鼠标双击:ActionChains(driver).double_click(ele).perform()
• 模拟键盘
需导入键盘事件的类:
from selenium.webdriver.common.keys import Keys
单个按键:定位目标.send_keys(Keys.ENTER)#回车,主要看Keys内键盘名
组合按键:定位目标.send_keys(Keys.CONTROL,‘x’)#control+x键
• 三种等待时间
导入时间模块:import time
1、程序休眠5s:time.sleep(5)
2、设定的最大等待时间:driver.implicity_wait(10) (等待的时长等于下一条程序刷出的时间)
3、from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
ele=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.XPATH,”//div[@class=‘schbox’/form/input[1]]”)))
#最长等待时间是5秒,直每隔0.5秒检测定位目标,直到定位控件加载出来
也可以until_not+定位上一界面的消失
• 多窗口的切换
driver.window_handles#所有窗体信息
driver.current_window_handles#当前焦点的页面信息
切换窗体:driver.switch_to.window(driver.window_handles[1])
关闭所有窗口:driver.quit()
关闭当前窗口:driver.close()
⚠️打开子窗口后,焦点还在原窗口,需进行切换才能在子窗口进行操作
• 中断alert(与弹窗区别开来,它是无法查看元素的)
driver.switch_to.alert.send_keys(“test”)
print(driver.switch_to.alert.text)
确定:driver.switch_to.alert.accept()
取消:driver.switch_to.alert.dismiss()
三种设定:确定/确定、取消/文本输入
• 截图
driver.get_screenshot_as_file(“E:/photo/1.png”)#直接添加存储路径和名字
⚠️有alert弹出框的时候是无法截图的
• iframe(html嵌入html)
iframe表插入存在,要注意⚠️,它插入了又一层的子html,按照原来的操作会定位不到
错误定位:driver.find_element_by_name(‘ ’)
定位方式:首先要进入iframe
1、driver.switch_to.frame(‘x-URS-iframe’)#引号内容为id或name对应的值
(⚠️对应的值会发生变化,就不适合该种方式)
2、定位到iframe(通用)
dd=driver.find_element_by_xpath(“//div[@id=‘loginDiv’]/iframe”)
driver.switch_to.frame(dd)
后面就可以使用常规定位方式了
driver.switch_to.parent_frame()#从子frame切回到上一级的父frame
driver.switch_to.default_content()#切回主文档,最开始的级别
• Select
导入类:from selenium.webdriver.support.select import Select
s=driver.find_element_by_id(“room”)
Select(s).select_by_visible_text(“2间”)
Select(s).select_by_index(3)#从0开始
Select(s).select_by_value(“5”)#option的值
• 对于时间的处理
定位到输入框:ele=driver.find_element_by_id(“HD_CheckOut”)
清除:ele.clear()
重新输入:ele.send_keys(“2020-05-01”)
• Unittest框架
import unittest
setUp初始化
tearDown收尾
测试用例方法执行(每执行一次,都会进行初始化和收尾)
⚠️方法名必须以test开头
class TestShouye(unittest.TestCase): def setUp(self): def tearDown(self): def testShouye01_01(self): Iif _name_==“_main_”: unittest.main()#类的入口函数
• 断言方法(检查点)
self.assertEqual(“退出”,定位目标变量.text)#对比实际结果与预期结果相同
self.assertNotEqual(“dd”,定位目标变量.text)#对比不同
self.assertIn(‘到云商’,定位目标变量.text)#后面的文本包含了‘到云商’
同理+NoIn
self.assertTure(目标定位.is_displayed())# 看控件是否显示
同理+False
自由编写(较灵活):
if longinText.text==‘177’:
print(‘等于’)
else:
print(‘不等于’)
self.driver.find_element_by_name(‘二流子’)#不存在的定位目标,目的是为了执行到此处时报错,不然此用例能够被pass