在进行 Web 端测试的时候,为了保证网站能在不同的浏览器都有一个良好的表现,我们通常会进行浏览器的兼容测试。浏览器兼容测试的工具非常非常多,比如说大名鼎鼎的browserling。

但是在自动化测试中如何实现浏览器的兼容测试,却没有太多的参考教程,绝大多数的教程都是介绍几个 selenium 的 API,然后就让你自己去拓展,丝毫没有提到通过不同的浏览器运行自动化测试代码的问题。

那么,同一套自动化测试的代码,能不能通过简单的配置,就能启动不同的浏览器分别进行测试呢?

我写了几个简单的 demo,证实通过一些简单的配置是可以做到浏览器兼容测试的,下面我把具体的过程分享出来。

1

1、测试

首先我们需要选定一门编程语言和测试框架。我们就使用 Python 语言的 pytest 进行测试,然后使用 selenium 这个工具去控制浏览器的运行。

因为每一个测试用例,我们都需要开启和关闭浏览器,所以开关浏览器的动作可以设置成前置条件(Setup)和后置清理(Teardown),在 pytest 的这个框架当中,我们使用夹具(fixture)实现浏览器的开关。

# content of conftest.py from selenium import webdriver @pytest.fixture() def browser(): driver = webdriver.Chrome() yield driver driver.quit()

在一个 conftest.py 的文件当中,我们定义一个 browser 夹具。夹具在本质上来说是一个函数,我们只需要在这个函数名上面加一个装饰器,声明这是一个夹具就可以了。

在函数当中,通过 yield 返回浏览器对象,业务的之前的就是前置条件,必要的之后的就是后置清理。在这个例子当中,yield 之前启动一个浏览器,yield 之后关掉浏览器。

注意:夹具放到 conftest.py 这个文件当中,换成其他的文件名是不可以的。

准备好夹具以后,开始编写测试用例。为了方便说明,在测试用例当中,我们只做一件事情,就是打开一个网页。

def test_demo(browser): browser.get(“http://www.baidu.com”)

测试用例是一个以 test_开头的函数,这个函数的参数就是我们前面定义好的测试夹具。在执行测试用例函数之前, 程序会先调用测试夹具得到一个浏览器,在测试用例函数执行之后,测试夹具会把浏览器关掉。

现在我们可以直接在文件下通过 pytest 命令运行测试用例,此时你可以看到一个谷歌浏览器打开并访问了页面。

2

2、参数化实现兼容测试

但是现在这个测试夹具不能满足要求,因为它只初始化了一个 Chrome 浏览器,并不能动态的改成其他浏览器。而测试夹具函数当中,我们是不能随意传参数的。

但是要实现浏览器的兼容测试,必须每次运行 browser 测试夹具时动态传递浏览器名称。

实现的第一种方式是通过夹具的参数化。实现了夹具参数化以后,每次程序先会用其中的一个参数运行所有的测试用例,再换成其他的参数运行用例。

from selenium import webdriver browsers = { “firefox”: webdriver.Firefox, “chrome”: webdriver.Chrome, } @pytest.fixture(params=browsers.keys()) def browser(request): browser_name = request.param driver = browsers.get(browser_name)() yield driver driver.quit()

在这里例子中,我们先把浏览器的名称和要调用的 webdriver 对象绑定在一起,存在 browsers 这个字典当中。

然后通过 params 参数获取 broswer.keys(), 也就是所有可以使用的浏览器的名称。当程序运行以后,会自动先使用 Firefox 名称,启动火狐浏览器运行测试用例,再换成 Chrome 浏览器运行用例。

如果还有更多的浏览器需要测试兼容性,只需要把他们添加 browsers 当中。

3、命令行指定浏览器

在上面的例子中,所有的浏览器都被提前配置到 browsers 变量当中,在运行自动化测试脚本后,所有的浏览器都会依次执行。但是有时候我们并不想这么干。我们就想指定浏览器去跑,又不想频繁修改代码,最省心的方式就是配置一个命令行参数。

pytest 要自定义命令行参数非常的简单,只需要在 pytest_addoption 这个钩子函数中添加命令行参数就可以, 这个钩子函数会收集所有的选项,把值保存到 config 当中。

现在我们给 pytest 自定义一个 –browser 的命令行参数:

def pytest_addoption(parser): parser.addoption( “–browser”, action=”store”, metavar=”browsername”, default=None, help=”config the browser to run”, )

配置好命令行参数以后,就可以在运行 pytest 的时候指定哪个浏览器运行了:

pytest –browser=chrome

但是现在如果直接运行的话,程序是无法根据你的参数去运行对应的浏览器的。还要改写 browser 测试夹具,从 config 当中获取浏览器名称:

browsers = { “firefox”: webdriver.Firefox, “chrome”: webdriver.Chrome, } @pytest.fixture() def browser(pytestconfig): browser_name = pytestconfig.getoption(‘browser’) if browser_name not in browsers: raise ValueError(f”browser {browser_name} not supported”) driver = browsers.get(browser_name)() yield driver driver.quit()

pytestconfig 是 pytest 自带的测试夹具,可以作为参数放到其他的家具当中,它的作用是获取所有的配置信息。