什么是WebDriver?
WebDriver是用于与实时Web浏览器进行交互的可编程界面。它使测试自动化能够打开浏览器,发送点击,键入键,刮擦文本并最终干净地退出浏览器。WebDriver界面是W3C建议书。WebDriver标准的最受欢迎的实现是Selenium WebDriver,它是免费和开放源代码。
WebDriver具有多个组件:
- 语言绑定。诸如Selenium WebDriver之类的软件包为浏览器交互 提供了编程语言绑定。Selenium支持主要语言,例如C#,Java,JavaScript,Ruby和Python。
- 自动化代码。程序员使用语言绑定来自动化浏览器交互。常见的 交互包括查找元素,单击元素以及抓取文本。通常,这是使用测 试自动化框架编写的。
- JSON Wire协议。语言绑定使用JSON对每个交互进行编码,并将 它们作为REST API请求发送到浏览器的驱动程序。JSON Wire协议 独立于平台和语言。
- 浏览器驱动程序。该驱动程序是测试计算机上的独立可执行文件。它充当交互的调用方和浏览器本身之间的代理。它接收JSON交互请 求,并使用HTTP将其发送到浏览器。
- 浏览器。浏览器呈现被测网页。它基本上由驾驶员控制。所有主要 的浏览器都支持WebDriver。每个浏览器还需要将自己的驱动程序 类型与浏览器安装在同一台计算机上,并且可以从系统路径进行 访问。例如,谷歌浏览器需要ChromeDriver。
安装Selenium WebDriver
对于我们的测试项目,我们将Selenium WebDriver的Python绑定与Google Chrome和ChromeDriver结合使用。我们可以使用任何浏览器,但请使用Chrome,因为(a)它具有很高的市场份额,并且(b)其开发人员工具稍后会派上用场。
验证ChromeDriver是否可以从命令行运行:
代码语言:javascript复制$ chromedriver
Starting ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
然后,将Python的selenium
软件包安装到我们的环境中:
$ pipenv install selenium --dev
现在,机器应该可以进行网络测试了!
新测试
在名为的目录下创建一个新的Python模块。这个新模块将保存我们的Web UI测试。然后,添加以下导入语句:tests/test_web.py
import pytest
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
为什么我们需要这些进口?
pytest
将用于固定装置Chrome
提供ChromeDriver绑定Keys
包含用于浏览器交互的特殊按键
WebDriver设置和清理
作为最佳实践,每个测试用例都应使用其自己的WebDriver实例。尽管设置和清除会给每个测试增加几秒钟的时间,但是每个测试使用一个WebDriver实例可使测试保持简单,安全和独立。如果一个测试遇到问题,那么其他测试将不会受到影响。另外,为每个测试使用单独的WebDriver实例可以使测试并行运行。
最好使用pytest固定装置处理WebDriver设置。fixtures是pytest出色的设置和清除功能,它们也可以进行依赖项注入。任何需要WebDriver实例的测试都可以简单地调用fixture来获取它。
代码
将以下代码添加到:tests/test_web.py:
@pytest.fixture
def browser():
driver = Chrome()
driver.implicitly_wait(10)
yield driver
driver.quit()
browser
是一个pytest固定功能,如装饰器所示。让我们逐步完成每一行,以了解此新装置的功能。@pytest.fixture
driver = Chrome()
Chrome()
使用默认选项在本地计算机上初始化ChromeDriver实例。它返回的驱动程序对象已绑定到ChromeDriver实例。所有WebDriver调用都将通过它进行.
driver.implicitly_wait(10)
Web UI测试自动化中最痛苦的部分是在触发交互之后等待页面加载/更改。该页面需要时间来呈现新元素。如果自动化尝试在存在新元素之前对其进行访问,则WebDriver将引发一个NoSuchElementException
。等待不当是Web UI测试“不稳定”的主要来源之一。
implicitly_wait
上面的 方法告诉驱动程序,每当尝试找到元素时,它们要等待10秒钟才能存在。等待机制很聪明:当元素出现时,它不会停止等待10秒钟,而是会立即停止等待。隐式等待被声明一次,然后自动用于 所有元素。另一方面,显式等待可以以每次显式等待调用为代价为每个交互提供自定义等待。作为最佳实践,用等待一个风格 完全用于测试自动化。混合显式和隐式等待会产生令人讨厌的意外副作用。对于我们的测试项目,隐式等待10秒应该是合理的(如果您的Internet连接速度很慢,请增加此超时时间以进行补偿)。
yield driver
pytest固定装置应返回一个表示已设置内容的值。我们的装置返回对初始化的WebDriver的引用。但是,return
它使用而不是使用语句,这yield
意味着fixture 是generator。fixture 的第一个迭代-在我们的例子中是WebDriver初始化-是在测试开始之前要调用的“设置”阶段。第二个迭代(将quit
称为调用)是测试完成后要调用的“清理”阶段 。编写夹具作为生成器将相关的设置和清理操作放在一起作为一个关注点。
driver.quit()
无论发生什么情况,始终在测试结束时退出WebDriver实例。测试自动化结束时,测试机上的驱动程序进程不会总是死掉。未能明确退出驱动程序实例可能会使它作为僵尸进程运行,这可能会消耗甚至锁定系统资源。