上篇,给大家介绍了一款自动化测试框架——airobots。今天给大家演示怎么用airobots做web自动化。
下载demo项目(可选)
airobots可直接通过命令执行用例文件或用例目录来进行测试:
代码语言:javascript复制airobots -t web 用例文件或用例目录路径
查看帮助
代码语言:javascript复制airobots -h
usage: airobots [-h] [-v] -t {api,web,ios,android} [-b {Firefox,Chrome,Ie,Opera,Safari,PhantomJS}] [-r REMOTE URL]
Airobots Union Auto Test Framework
optional arguments:
-h, --help show this help message and exit
-v, --version show version
-t {api,web,ios,android}, --type {api,web,ios,android}
test type, choices: api, web, ios, android
-b {Firefox,Chrome,Ie,Opera,Safari,PhantomJS}, --browser {Firefox,Chrome,Ie,Opera,Safari,PhantomJS}
test browser, choices: Firefox, Chrome, Ie, Opera, Safari, PhantomJS
-r REMOTE URL, --remote-url REMOTE URL
web test's remote url, eg. http://localhost:4444/wd/hub
但通常,为了更方便管理我们的测试脚本和开发一些自定义方法,我们都会对用例脚本做一些组织,用不同的目录来区分不同的作用,demo是我在项目中的组织方式,大家也可以按自己的习惯进行。demo下载地址:https://github.com/BSTester/AirobotsDemo
。
目录结构说明:
代码语言:javascript复制 ├─Library # 测试相关自定义库
├─Resource # 测试相关资源文件
│ ├─TestFiles
│ └─TestSQL
├─Results # 测试报告存放目录
├─TestCases # 测试用例存放目录
│ ├─APICase # API测试用例存放目录
│ ├─WebCase # Web测试用例存放目录
│ ├─AndroidCase # Android测试用例存放目录
│ ├─IOSCase # IOS测试用例存放目录
│ └─PageObjects # POM文件存放目录
└─WebChrome # 浏览器远程客户端相关服务
├─SeleniumGrid
└─WebDriver
使用前请先安装相关依赖包, 执行以下命令会自动安装。
代码语言:javascript复制pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
运行WEB测试,需要安装ChromeDriver和GeckoDriver,可到https://npm.taobao.org/mirrors/
下载安装,或安装nodejs之后执行以下命令安装。
npm install -g chromedriver geckodriver
至此,环境准备完成。
运行示例用例脚本
airobots进行web测试,本质还是利用的selenium,但用到的是robotframework二次封装过的方法,更加方便和容易理解,同时结合了airtest的图像识别技术,对不易用xpath定位的控件,多了一种定位手段。这里还是建议优先使用id、css、xpath定位,在这些都无法定位的情况下,再使用图像识别。图像识别有误差,对识别的截图和页面环境要求较高,比如截图不能保留太多空白背景,对文字截图识别率偏低等。
那现在以百度搜索为例,给大家演示一下,怎么进行web测试。
在项目根目录执行
代码语言:javascript复制airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results
看到如下运行结果即表示执行成功。
运行以下命令生成报告:
代码语言:javascript复制allure serve Results
20210310010455
报告详细记录了操作步骤和步骤截图
20210310010627
代码解析
TestCases/WebCase/test_hello.py
是测试用例文件
from airtest.core.api import *
from airobotLibrary import AirSelenium # web测试必须引用此模块
from unittest import TestCase
from airtest.core.settings import Settings as ST
from TestCases.PageObjects.Web.baidu_demo import DemoOP
from Library.common_library import CommonLibrary
import pytest
###### 以上为引用的必要模块
class CustomCase(TestCase):
"""Custom launcher."""
@classmethod
def setUpClass(cls):
super(CustomCase, cls).setUpClass()
cls.wd = AirSelenium() # 实例化一个浏览器
cls.wd.set_window_size(1920,1080)
cls.wd.set_browser_implicit_wait(20)
cls.baidu = DemoOP(driver=cls.wd) # 对页面操作的封装类
def setUp(self):
"""Custom setup logic here."""
# ST.THRESHOLD = 0.75 # 设置图像识别的阈值,达到75%即匹配成功
super(CustomCase, self).setUp()
def tearDown(self):
"""Custom tear down logic here."""
super(CustomCase, self).tearDown()
@classmethod
def tearDownClass(cls):
super(CustomCase, cls).tearDownClass()
cls.wd.close_browser()
@pytest.mark.second_to_last # 执行顺序设置,倒数第二个执行
def test_baidu(self):
# 使用RobotFrameWork-SeleniumLibrary方法
self.wd.go_to('https://www.baidu.com')
# self.wd.maximize_browser_window()
# 调用 PageObject
self.baidu.search_and_click('软件测试', '百度百科')
self.wd.switch_window('NEW')
self.wd.page_should_contain('百度百科')
# 可混合使用selenium原生方法,通过self.wd.driver调用, self.wd为robotframework方法
self.wd.driver.get('https://www.qq.com')
self.wd.click_link('新闻')
self.wd.switch_window('NEW')
title = self.wd.get_title()
# airtest断言方法
assert_equal(title, '新闻中心-腾讯网', '对比页面标题')
TestCases/PageObjects/Web/baidu_demo.py
是PageObject类文件
from airtest.core.api import *
from unittest import TestCase
from airtest.core.settings import Settings as ST
from airobotLibrary import AirSelenium
from pathlib import Path
###### 以上为引用的必要模块
TPL_PATH = Path(__file__).parent # 获取当前文件所在目录路径,图像识别截图一般跟脚本放一起,图像识别需要绝对路径,否则可能会找不到图片
class DemoOP(TestCase):
"""Demo page objects."""
# 定义页面控件识别方式,一般优先选择id或xpath
SEARCH_BOX = '//*[@id="kw"]'
# SEARCH_BUTTON = '//*[@id="su"]'
# 使用图像识别方式, 图片必须是绝对路径,通过Template实例化
SEARCH_BUTTON = Template(Path.joinpath(TPL_PATH, 'baidu.png'))
LINK = '//div/h3/a[contains(string(), "{}")]'
def __init__(self, driver):
super(DemoOP, self).__init__()
self.wd = driver or AirSelenium() # AirSelenium() 可有可无,加上方便编写脚本时自动关联出webdriver的方法。
def input_keywords(self, text):
self.wd.input_text(self.SEARCH_BOX, text=text)
def click_search_button(self):
# 使用图片断言
self.wd.air_assert(self.SEARCH_BUTTON, '搜索按钮是否存在')
# 使用图像识别查找控件并点击,self.wd.air_开头的都为图像识别方法
self.wd.air_click(self.SEARCH_BUTTON)
def search(self, text):
self.input_keywords(text=text)
self.click_search_button()
sleep(1)
def search_and_click(self, text, click_text):
self.search(text)
self.wd.set_focus_to_element(self.LINK.format(click_text))
self.wd.click_link(self.LINK.format(click_text))
高级技巧
通过无头浏览器运行测试
实例化AirSelenium时,加上headless=True
参数
@classmethod
def setUpClass(cls):
super(CustomCase, cls).setUpClass()
cls.wd = AirSelenium(headless=True) # 加上headless=True,启动无头浏览器
cls.wd.set_window_size(1920,1080)
cls.wd.set_browser_implicit_wait(20)
cls.baidu = DemoOP(driver=cls.wd) # 对页面操作的封装类
运行远程浏览器(分布式测试)
在demo项目中,WebChrome目录中为预先配置好的selenium grid服务和远程浏览器,可实现分布式测试。
需要安装docker服务,构建镜像后启动,安装好docker和docker-compose后,执行以下命令启动服务:
代码语言:javascript复制docker-compose up
20210310014838
服务启动完成后,打开浏览器输入地址:http://localhost:6080
,输入密码test123456
后及进入远程浏览器终端。
20210310014946
运行以下命令,在远程浏览器中执行测试。
代码语言:javascript复制airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results -r http://localhost:6044/wd/hub
20210310015049
使用Firefox浏览器运行
代码语言:javascript复制airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results -r http://localhost:6044/wd/hub -b Firefox
20210310015307
注册浏览器
代码语言:javascript复制java -jar selenium-server-standalone.jar -role node -hub http://localhost:6044/grid/register
20210310015547
使用Safari浏览器运行
代码语言:javascript复制airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results -r http://localhost:6044/wd/hub -b Safari
以上, 为web测试的一个大体过程,不管用什么框架,web测试的难点基本都是在于元素定位,这里推荐大家一个xpath识别插件,还是比较好用的——POM Builder,能根据id、css、name、xpath等多种方式识别元素。
20210310020526
当然,更为方便的是安装selenium ide,通过录制生成脚本,更多功能就需要大家去探索了。
20210310020815
下期,为大家介绍怎么用airobots进行接口测试。