硒 是浏览器自动化的绝佳工具。 使用 Selenium IDE,您可以记录命令序列(如单击、拖动和键入)、验证结果并最终存储此自动化测试以供以后使用。 这对于在浏览器中进行主动开发非常有用。 但是,当您想将这些测试与您的 CI/CD 流程集成时,就该转向 Selenium WebDriver。
WebDriver 公开了一个与许多编程语言绑定的 API,它允许您将浏览器测试与其他测试集成。 这篇文章向您展示了如何在容器中运行 WebDriver 并将其与 Python 程序一起使用。
使用 Podman 运行 Selenium
Podman 是以下示例中的容器运行时。 有关如何开始使用 Podman,请参阅上一篇文章。
这 example 为 Selenium 使用一个独立的容器,其中包含 WebDriver 服务器和浏览器本身。 要在后台启动服务器容器,请运行以下命令:
$ podman run -d --network host --privileged --name server docker.io/selenium/standalone-firefox
当您使用特权标志和主机网络运行容器时,您可以稍后从 Python 程序连接到此容器。 你不需要使用 sudo.
在 Python 中使用 Selenium
现在您可以提供一个使用该服务器的简单程序。 这个程序是最小的,但应该让你知道你可以做什么:
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities server ="https://127.0.0.1:4444/wd/hub" driver = webdriver.Remote(command_executor=server, desired_capabilities=DesiredCapabilities.FIREFOX) print("Loading page...") driver.get("https://fedoramagazine.org/") print("Loaded") assert "Fedora" in driver.title driver.quit() print("Done.")
首先,程序连接到您已经启动的容器。 然后它加载 Fedora 杂志网页并断言“Fedora”是页面标题的一部分。 最后,它退出会话。
为了运行程序,需要 Python 绑定。 既然您已经在使用容器,为什么不在容器中也这样做呢? Save 以下为文件名Dockerfile:
FROM fedora:29 RUN dnf -y install python3 RUN pip3 install selenium
然后使用 Podman 在与 Dockerfile 相同的文件夹中构建您的容器映像:
$ podman build -t selenium-python .
要在容器中运行程序,请在运行容器时将包含 Python 代码的文件挂载为卷:
$ podman run -t --rm --network host -v $(pwd)/browser-test.py:/browser-test.py:z selenium-python python3 browser-test.py
输出应如下所示:
Loading page... Loaded Done.
接下来做什么
这 example 上面的程序是最小的,也许没有那么有用。 但它几乎没有触及可能的表面! 查看文档 硒 并且对于 Python 绑定. 在那里,您将找到有关如何在页面中定位元素、处理弹出窗口或填写表单的示例。 拖放也是可能的,当然还有等待各种事件。
实现了一些不错的测试后,您可能希望将整个内容包含在 CI/CD 管道中。 幸运的是,这相当简单,因为一切都是容器化的。
您可能也有兴趣建立一个 网格 并行运行测试。 这不仅有助于加快速度,而且还允许您同时测试多个不同的浏览器。
打扫干净
使用完容器后,可以使用以下命令停止并删除独立容器:
$ podman stop server $ podman rm server
如果您还想释放磁盘空间,请运行以下命令来删除图像:
$ podman rmi docker.io/selenium/standalone-firefox $ podman rmi selenium-python fedora:29
结论
在这篇文章中,您已经看到使用容器技术开始使用 Selenium 是多么容易。 它允许您自动与网站交互,以及测试交互。 Podman 允许您在没有超级用户权限或 Docker 守护程序的情况下运行必要的容器。 最后,Python 绑定允许您使用普通的 Python 代码与浏览器交互。