提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
在当今数字化浪潮汹涌澎湃的时代,互联网已然成为人们生活与工作不可或缺的关键部分。各类 Web 应用如雨后春笋般不断涌现,从日常购物的电商平台,到协同办公的各类软件即服务(SaaS)工具,再到社交娱乐的多元应用,其功能的复杂性和交互的频繁度持续攀升。这一动态变化不仅对开发者提出了严苛挑战,更让保障应用质量与用户体验成为横亘在测试团队面前的一座峻岭。
当我们踏上探索 Web 自动化测试这一征程,绝非浅尝辄止于工具的机械运用,而是深入剖析从测试策略精心擘画,到脚本匠心雕琢,再到执行结果深度剖析的全生命周期逻辑。在后续篇章,我们将层层拆解自动化测试架构的搭建奥秘,手把手带你遴选契合项目特性的工具集,分享实战场景里疑难症结的破解要诀,一同见证如何借自动化之力让 Web 应用品质脱胎换骨,从容应对瞬息万变的数字市场严苛试炼,为用户呈上流畅无瑕的线上交互盛宴。此刻,且随我一同揭开 Web 自动化测试的神秘面纱,开启这段满是惊喜与收获的求知旅程。
自动化是指让机器代替人为完成指定目标。
好处:
1.减少劳动力
2.提高效率
3.规格统一标准
4.提高产品质量
校验系统是否满足规定需求,弄清预期结果与实际结果的区别。
让程序代替人工去验证系统功能的过程
好处:
1.较少时间内运行更多的测试用例
2.自动化脚本可重复运行
3.减少人为操作失误
4.克服手工测试的局限性
误区:
1.自动化测试可以完全代替手工测试
2.自动化测试一定比手工测试厉害
3.自动化测试可以发掘更多BUG
4.自动化测试适用于更多功能
1.回归测试:项目在发布新版本之后对项目之前的功能进行测试
2.压力测试:可以理解为多用户同时去操作软件,统计软件服务器处理多用户请求功能
3.兼容性测试:不同浏览器(IE,Firefox,chrome等),分辨率,操作系统等
4.提高测试效率,保证产品质量
1.web-自动化测试
2.移动自动化测试
3.接口-自动化测试
4.单元测试-自动化测试
1.需求变动不频繁
2.项目周期长
3.项目需要回归测试
Web自动化测试属于黑盒测试(功能测试)
1.黑盒测试(功能测试)
2.白盒测试(单元测试)
3.灰盒测试(接口测试)
1.QTP(收费)(支持web和桌面软件自动化)
2.Selenium(免费 开源)(只支持web项目)
3.Robot Framework(基于Python的可拓展关键字驱动的测试自动化框架)
1.开源软件:源代码开放可以根据需求来增加工具的某些功能
2.跨平台:linux,windows,mac
3.支持多种浏览器:Firebox,Chrome,IE,Edge,Opera
4.支持多种语言:Python,Java,C#,JavaScript,Ruby
5.成熟稳定:目前已经被google,百度,腾讯等公司广泛应用
6.功能强大:能够实现了类似商业工具的大部分功能,因为开源性,可实现定制化功能
1.selenium1.0
(1) selenium IDE(录制自动化代码工具)
(2) selenium Grid(分布式工具,同时启动多个浏览器)
(3) selenium RC(通过JS模拟浏览器,实现自动化方式)
2.selenium2.0(稳定推荐版)
selenium1.0+WebDriver
3.selenium3.0
2.0升级版,支持Java,windows10,Edge浏览器,safa浏览器
无论是2.0还是3.0编写的自动化脚本,API方法是不变的,唯一不同就是环境不同
1.安装selenium
pip install selenium
2.浏览器的安装即驱动(注意:要根据浏览器版本找对应的浏览器驱动)
3.将驱动器添加到环境变量中
#导包
from selenium import webriver
from time import sleep
#获取浏览器驱动
driver = webdriver.Firefox()
#打开url
driver.get('http://baidu.com')
#暂停3秒
sleep(3)
#退出驱动
driver.quit()
要使用web自动化操作元素,必须首先找到此元素。
1.火狐:firebug
2.谷歌:f12(开发者工具)
1.标签名
2.属性
3.层级
4.路径
1.id
2.name
3.class_name(使用元素的class)
4.tag_name(标签名称)
5.link_text(定位超链接 a标签)
6.partial_link_text(定位超链接 a标签 模糊匹配)
7.xpath(基于元素路径)
8.css(元素选择器)
基于元素属性特有的定位方式(id/name/class_name/)
基于元素标签名称定位(tag_name)
基于超链接文本定位(link_text/partial_link_text)
基于元素路径定位(xpath)
基于选择器(css)
通过元素id的属性定位,id一般情况下在当前页面是唯一的。
语法:driver.find_element(By.ID,"id")
#导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
#获取浏览器对象
driver = webdriver.Firefox()
#打开本地页面
url = "file:///D:/BaiduNetdiskDownload/web%E8%87%AA%E5%8A%A8%E5%8C%96_day01_%E8%AF%BE%E4%BB%B6+%E7%AC%94%E8%AE%B0+%E8%B5%84%E6%96%99+%E4%BB%A3%E7%A0%81/web%E8%87%AA%E5%8A%A8%E5%8C%96_day01_%E8%AF%BE%E4%BB%B6+%E7%AC%94%E8%AE%B0+%E8%B5%84%E6%96%99+%E4%BB%A3%E7%A0%81/02_%E5%85%B6%E4%BB%96%E8%B5%84%E6%96%99/%E6%B3%A8%E5%86%8CA.html"
driver.get(url)
#查找用户名
username = driver.find_element(By.ID,"userA")
#查找密码
password = driver.find_element(By.ID,"passwordA")
#用户名输入admin(send_keys("内容"))
username.send_keys("admin")
#密码输入123456
password.send_keys("123456")
#暂停3秒
sleep(3)
#退出浏览器驱动
driver.quit()
通过元素name的属性定位
语法:driver.find_element(By.NAME,"name")
通过元素class的属性定位.
语法:driver.find_element(By.CLASS_NAME,"class_name")
通过元素标签名来定位,如果存在多个标签取第一个
语法:driver.find_element(By.TAG_NAME,"tag_name")
定位超链接标签,只能使用精准匹配(a标签的全部文本内容)
语法:driver.find_element(By.LINK_TEXT,"a标签的全部文本内容")
定位超链接标签,可以使用精准或者模糊匹配,最好只用唯一关键词(如果多个值,默认返回第一个)
语法:driver.find_element(By.PARTIAL_LINK_TEXT,"a标签的文本内容")
基于元素路径定位
语法:driver.find_element(By.XPATH,"路径")
常用的定位策略:
(1)路径:
绝对路径:以单斜杠开头逐级开始填写,不能跳级
相对路径:以双斜杠开头后跟元素名称,不知元素名称可用*代替
(2)路径结合属性:所有属性都要使用@修饰([@id='id'])
(3)路径结合逻辑(多个属性)://*[@id='id'and@属性=‘属性值’]
(4)路径结合层级://*[@id="父类id值"]/input
一般建议使用指定标签名称,*效率比较慢
无论绝对路径还是相对路径,/后面都要跟元素名称或者*
在工作中如果能使用相对路径绝对不使用绝对路径
拓展:
(1)//*[text()='xxx'] 定位文本值等于xxx的元素,一般适用p标签和a标签
(2)//*[contains(@属性,'xxx')] 定位包含xxx的元素
(3)//*[start-with(@属性,‘xxx’)] 定位以xxx开头的元素
CSS是一种标记语言,焦点数据的样式
通过CSS选择器进行定位
极力推荐使用,查找元素效率比XPath高,语法比XPath简单
id选择器:元素必须有id属性
语法:#id
class选择器:元素必须有class属性
语法:.class
元素选择器:element
属性选择器:[属性名='属性值']
层级选择器:p > input p input
>与空格的区别:大于嗨必须为子元素,空格则不用
拓展:
[属性^=‘开头的字母’] 获取指定属性以指定字母开头的元素
[属性$='结尾的字母'] 获取指定属性以指定字母结尾的元素
[属性*=‘包含的字母’] 获取指定属性包含指定字母的元素
语法:driver.find_elements()
返回结果:类型位列表,要对列表进行访问和操作必须指定下标进行遍历
(1)输入方法:send_keys()
(2)点击方法:click()
(3)清空方法:clear()
在输入操作之前一定要清空
(1)最大化窗口:maximize_window()
(2)设置窗口大小:set_window_size()
(3)设置窗口位置:set_window_position()
(4)后退:back()
(5)前进:forword()
(6)刷新:refresh()
(7)关闭当前页面:close()
(8)关闭由driver对象启动的所有窗口:quit()
(9)获取页面Title:title()
(10)获取当前页面url:current_url()
(1)获取元素大小:size
(2)获取元素文本:text
(3)获取元素属性:get_attribute("元素属性名")
(4)元素是否可见:is_displayed()
(5)元素是否可用:is_enabled
(6)元素是否被选中:is_selected
text和size调用时无括号
为了满足丰富的html鼠标效果,必须使用对应方法
ActionChain类中---->导包
(1)右击:context_click(element).perform()
(2)双击:double_click(element).perform()
(3)拖拽:drag_and_drop(sorch,target).perform()
拓展:drag_and_drop_by_offset(sourch,xofffser=,yoffset=).perform()
(4)悬停:move_to_element(element).perform()
(5)执行:perform()
虽然selenime框架中提供了右击鼠标方法,但是没有提供右击菜单的方法,可以通过发送快捷键的方式解决(经测试谷歌浏览器不支持)
键盘对应的方法都在keys中
(1)CONTROL:ctrl键
(2)BACKSPACE:删除键
(3)ctrl+c:keys.CONTROL,'c'
driver.find_element(By.CSS_SELECTOR,'#passwordA').send_keys(Keys.CONTROL,'v')
元素等待分类
隐式等待
driver.implicittly_wait() #一般设置30秒
针对所有元素生效,一般为前置必写代码
显示等待
WebDriverWait(driver, timeout=10, poll_frequency=0.5).until(lambda x: x.find_element(By.ID, '#user')).send_keys('admin')
timeout:超时时间
poll_frequery:访问频率,默认0.5秒找一次元素
愿大家在往后的项目实战中,能灵活运用这些知识,让自动化测试成为提升软件质量、加速交付周期的得力助手。