如何利用airobots做web自动化测试

上篇,给大家介绍了一款自动化测试框架——airobots。今天给大家演示怎么用airobots做web自动化。

下载demo项目(可选)

airobots可直接通过命令执行用例文件或用例目录来进行测试:

airobots -t web 用例文件或用例目录路径

查看帮助

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

目录结构说明:

    ├─Library                           # 测试相关自定义库
    ├─Resource                          # 测试相关资源文件
    │  ├─TestFiles
    │  └─TestSQL
    ├─Results                           # 测试报告存放目录
    ├─TestCases                         # 测试用例存放目录
    │  ├─APICase                        # API测试用例存放目录
    │  ├─WebCase                        # Web测试用例存放目录
    │  ├─AndroidCase                    # Android测试用例存放目录
    │  ├─IOSCase                        # IOS测试用例存放目录
    │  └─PageObjects                    # POM文件存放目录
    └─WebChrome                         # 浏览器远程客户端相关服务
        ├─SeleniumGrid
        └─WebDriver

使用前请先安装相关依赖包, 执行以下命令会自动安装。

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测试。

在项目根目录执行

airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results

看到如下运行结果即表示执行成功。
20210310010000

运行以下命令生成报告:

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后,执行以下命令启动服务:

docker-compose up 

20210310014838

服务启动完成后,打开浏览器输入地址:http://localhost:6080,输入密码test123456后及进入远程浏览器终端。

20210310014946

运行以下命令,在远程浏览器中执行测试。

airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results -r http://localhost:6044/wd/hub 

20210310015049

使用Firefox浏览器运行

airobots -t web TestCases/WebCase/test_hello.py --clean-alluredir --alluredir=Results -r http://localhost:6044/wd/hub -b Firefox

20210310015307

注册浏览器

java -jar selenium-server-standalone.jar -role node -hub http://localhost:6044/grid/register

20210310015547

使用Safari浏览器运行

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进行接口测试。