一、概念:
什么是web自动化测试?
把以人为驱动的测试行为转化为机器执行的过程,通过测试工具录制软件或编写脚本,对web对象进行输入数据,单击等操作,比较预期结果和实际结果,产出测试报告。
web自动化的范畴:
UI层的黑盒测试
什么样的项目适合做web自动化测试?
- web界面稳定,变动少
- 项目维护周期长
- 频繁的回归测试
- 项目进度压力不大
- 被测系统开发较为规范,具备可测试性
- 测试人员具有一定的编程能力
自动化的作用
- 能代替人解决繁琐的回归测试,提高效率
- 自动化测试脚本设计一次能重复运行
- 执行结果高度一致,避免人为的出错
- 可以实现自动或者定时执行测试
前期知识积累:
Python-Pytest-Allure
PageObject设计概念
模块驱动、数据驱动、关键字驱动概念
HTML:知道标签的含义,如何确定元素的绝对路径,识别并切换iframe等
Xpath、CSS:元素定位语句
JavaScript、jQuery
二、环境搭建(mac)【文末免费分享WEB自动化测试配套资源】
依赖:
- Python3
- Pycharm
- Chrome
- Selenium3
- ChromeDriver
- Pytest
- Allure
安装:
- selenium
- ChromeDriver下载,选择对应版本
chromedriver.storage.googleapis.com/index.html
- 将下载好的chromedriver移到 /usr/local/bin 目录下
验证:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/1/7 20:30
# @Author : jlyu
# @File : test.py
from selenium import webdriver
# 打开chrome浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://www.baidu.com")
效果:
三、元素定位
元素定位是很重要的一个环节,想要对页面进行操作,首先得定位到要操作的元素,然后才能发送指令。利用Chrome的控制台可以查看页面元素,每个元素有对应的标签名、属性和层级关系
一个快速找到组件相关属性的技巧:
封装的一些元素查找方法:
if by == 'xpath':
elements = self.driver.find_element_by_xpath(element_by)
elif by == "css":
elements = self.driver.find_element_by_css_selector(element_by)
elif by == 'id':
elements = self.driver.find_element_by_id(element_by)
elif by == 'classname':
elements = self.driver.find_element_by_class_name(element_by)
elif by == 'name':
elements = self.driver.find_element_by_name(element_by)
elif by == 'text':
elements = self.driver.find_element_by_link_text(element_by)
else:
return None
对应的查找方式:
driver.find_element_by_xpath("//input[@id='su']") # 查找tag为input,id为su的元素
driver.find_element_by_css_selector("#su") # id为su的元素
driver.find_element_by_id("su") # id为su的元素
driver.find_element_by_class_name("btn self-btn bg s_btn") # 定位失败,因为name不唯一
driver.find_element_by_link_text("百度一下") # 定位失败,因为text不唯一
driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[2]/input") # 绝对路径
定位技巧:通过CSS和Xpath语法定位,有id属性的,优先使用id定位,其次是name、text等属性。不推荐绝对路径查找,一是层级太多查找麻烦,二是受页面变动影响大,不易维护。某个元素没有属性时,可以先通过父节点或兄弟节点定位到最近一级,再通过层级关系来定位。
四、WebDriver介绍
WebDriver官方说明:
"""
Controls a browser by sending commands to a remote server.
This server is expected to be running the WebDriver wire protocol
as defined at
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
:Attributes:
- session_id - String ID of the browser session started and controlled by this WebDriver.
- capabilities - Dictionaty of effective capabilities of this browser session as returned
by the remote server. See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities
- command_executor - remote_connection.RemoteConnection object used to execute commands.
- error_handler - errorhandler.ErrorHandler object used to handle errors.
"""
web自动化测试工具-Selenium
主流的一些测试工具有Selenium、AutoRunner、Robot Framework、UTF。
Selenium是一个用于Web应用程序的开源自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样,支持的浏览器包括IE,Firefox,Safari,Chrome等。Selenium 不仅仅是一个工具或 API,它还包含了一些组件:Selenium WebDriver(驱动)、Selenium IDE(录制)、 Selenium Gird(分布式)
不支持在 Docs 外粘贴 block
elememt.click()代码对应的请求链接(post):
http://127.0.0.1:4444/wd/hub/session/277e823a-8be2-48eb-9001-971cc1bff9c4/element/1/click
点击操作执行成功后返回的信息:
{
"status": 0,
"sessionId": "277e823a-8be2-48eb-9001-971cc1bff9c4",
"state": "success",
"value": null,
"class": "org.openqa.selenium.remote.Response",
"hCode": 11068806
}
driver.get("http://www.baidu.com") # 打开浏览器并访问该地址
driver.maximize_window() # 是浏览器全屏
driver.set_window_size(100, 200) # 设置浏览器窗口大小
driver.get_window_size() # 获取浏览器窗口大小
driver.current_window_handle() # 获取当前窗口的句柄
driver.window_handles() # 获取所有窗口句柄
driver.refresh() # 刷新当前页面
driver.forward() # 当前页面前进
driver.back() # 当前页面后退
driver.get_screenshot_as_file("xxx.png") # 截图并保存
driver.get_cookie("cookieKey") # 获取cookie信息
driver.add_cookie({'name': 'jl', 'value': '123123123'}) # 添加cookie
driver.delete_cookie("jl") # 删除cookie
driver.switch_to.frame() # 切换iframe
driver.switch_to.alert() # 切换到警告弹窗
widows_handle = driver.current_window_handle # 获取标签页句柄
driver.switch_to.window(widows_handle) # 切换标签页
driver.close() # 关闭当前页面
driver.quit() # 关闭浏览器并退出驱动
driver.find_element_by_id("su").click() # 点击元素
driver.find_element_by_id("kw").send_keys() # 输入文本内容
driver.find_element_by_id("kw").clear() # 清除文本框内容
driver.find_element_by_id("su").submit() # 提交表单
driver.find_element_by_id("kw").is_displayed() # 判断元素是否存在
driver.find_element_by_id("kw").is_selected() # 判断元素是否已被勾选
driver.find_element_by_id("kw").is_enabled() # 判断元素的可编辑状态
driver.find_element_by_id("kw").get_property("kw") # 获取元素属性
driver.implicitly_wait(1) # 智能等待元素出现
tag_name = driver.find_element_by_id("kw").tag_name # 获取元素的名字
element_size = driver.find_element_by_id("kw").size # 获取元素的宽和高
text = driver.find_element_by_id("su").text # 获取元素的文本内容
location = driver.find_element_by_id("kw").location # 获取当前元素的坐标
五、实战
以百度网页的登录、搜索内容、修改网页配置为测试用例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/1/8 19:34
# @Author : jlyu
# @File : test_baidu.py
import time
import allure
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
username = "" # 输入百度用户名
password = "" # 输入百度账号密码
cookies = {} # 百度网页登录成功后的cookies
class TestBaidu:
"""
百度相关的WEB自动测试用例,用于演示
"""
@allure.title('登录用例')
def test_login(self):
print("开始登录用例")
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector('#u1>a').click()
driver.implicitly_wait(30)
driver.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn').click()
driver.find_element_by_id('TANGRAM__PSP_11__userName').send_keys(username)
time.sleep(3)
driver.find_element_by_id('TANGRAM__PSP_11__password').send_keys(password)
time.sleep(3)
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__submit"]').click()
time.sleep(3)
for cookie in cookies:
cookie_dict = {
"domain": ".baidu.com",
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
driver.add_cookie(cookie_dict)
driver.refresh() # 添加cookies后需要刷新一下网页
user_name = driver.find_element_by_css_selector('#s-top-username>span.user-name.c-font-normal.c-color-t').text # 获取登录后的用户名
assert user_name == username # 判断登录是否成功
time.sleep(3)
driver.quit()
@allure.title("搜索用例")
def test_search(self):
print("开始搜索用例")
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
for cookie in cookies:
cookie_dict = {
"domain": ".baidu.com",
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
driver.add_cookie(cookie_dict)
driver.refresh()
driver.find_element_by_id('kw').send_keys("selenium")
time.sleep(3)
driver.find_element_by_id('su').click()
time.sleep(3)
@allure.title("修改搜索结果显示条数用例")
def test_logout(self):
print("开始修改搜索结果显示条数用例20条")
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
for cookie in cookies:
cookie_dict = {
"domain": ".baidu.com",
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
driver.add_cookie(cookie_dict)
driver.refresh()
setting_element = driver.find_element_by_id('s-usersetting-top')
ActionChains(driver).move_to_element(setting_element).perform()
time.sleep(0.5)
search_setting = driver.find_element_by_link_text("搜索设置")
ActionChains(driver).move_to_element(search_setting).perform()
search_setting.click()
time.sleep(3)
choice = driver.find_element_by_name("NR")
choice.find_element_by_xpath('//*[@id="nr_2"]').click()
time.sleep(3)
driver.find_element_by_css_selector('#se-setting-7>a.prefpanelgo.setting-btn.c-btn.c-btn-primary').click()
time.sleep(3)
driver.switch_to.alert.accept()
time.sleep(3)
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
time.sleep(3)
def test_failcase(self):
print("一个失败的用例,用于观察报告")
assert 1 == 2
if __name__ == "__main__":
# test_baidu = TestBaidu()
# test_baidu.test_logout()
os.system("pytest -s -q --alluredir=../report/allure-json --clean-alluredir") # test_baidu.py::TestBaidu::test_failcase
os.system("allure generate ../report/allure-json -o ../report/allure-report --clean")
os.system("allure open /Users/bytedance/PycharmProjects/DPWebTest/report/allure-report)
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!