如何用 Bazel 运行 Selenium Java 绑定测试:测试目标、浏览器标签与跳过注解
【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/selenium
这篇文章解决一个具体问题:在 Selenium 仓库中,如何用 Bazel 跑通 Java 语言绑定(java/目录)的测试——包括如何定位测试目标、用浏览器标签筛选要跑哪些测试、以及测试失败时如何用 JUnit 跳过注解控制其运行范围。适用前提是你在 Selenium 仓库检出目录内工作,并已按 README 的要求装好 Bazelisk(自动按.bazelversion下载对应 Bazel 版本)、JDK 17 及以上,并将JAVA_HOME指向 JDK(可用javac命令是否可用来确认)。浏览器测试还需要一个可用的 X 显示环境(Linux 下可用虚拟 X 服务器,见文末)。
测试目标从哪里来:java_selenium_test_suite与*Test.java
Bazel 会为浏览器和远程 grid 分别创建独立的测试目标,具体支持哪些浏览器取决于该测试目录中BUILD.bazel文件的声明(见 java/TESTING.md)。测试文件本身不需要手动注册:*Test.java文件放在一个包含java_selenium_test_suite声明的BUILD.bazel所在目录即可被自动拾取。
以 java/test/org/openqa/selenium/bidi/BUILD.bazel 为例,声明形如:
java_selenium_test_suite( name = "large-tests", size = "large", srcs = glob(["*Test.java"]), browsers = BIDI_BROWSERS, tags = [ "selenium-remote", ], deps = [...], )其中browsers参数决定该套件会为哪些浏览器生成测试目标,取值列表定义在 java/defs.bzl(如BIDI_BROWSERS、SINGLE_BROWSER)。
目标的路径写法遵循 Bazel 惯例(见 README Building 一节):以//开头,接相对BUILD.bazel的目录路径,再用:接目标名。例如 bidi 目录下所有测试对应:
bazel test //java/test/org/openqa/selenium/bidi/...如果不确定某个目录下有哪些目标,可以先用bazel query查询构建图(AGENTS.md 建议用bazel query ...定位 label,再执行 build/test)。
运行测试的基本命令
java/TESTING.md 给出的主路径命令:
bazel test //java/... # 运行全部 Java 测试 bazel test //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest # 运行单个测试测试默认并行执行。常用附加参数(均来自 java/TESTING.md):
bazel test //java/... --pin_browsers # 使用固定版本的浏览器(文档标注为推荐) bazel test //java/... --flaky_test_attempts=3 # 失败测试最多重跑 3 次 bazel test //java/... --test_output=all # 结束后显示所有测试输出 bazel test //java/... --test_output=streamed # 实时显示输出(会禁用并行执行)另外,根 AGENTS.md 中列出的--cache_test_results=no用于禁用结果缓存、强制重新执行测试;CONTRIBUTING.md 的 Java 小节给出的本地测试命令就带上了该参数:
bazel test --cache_test_results=no --test_size_filters=small grid java/test/...用 size 与浏览器标签筛选测试
Bazel 按测试规模(size)和标签(tag)两个维度过滤。size 的含义(见 README Testing 一节):
small— 通常是不开浏览器的单元测试;medium— 比简单单元测试复杂、但不完全驱动浏览器;large— 通常真正驱动浏览器的测试。
对应的过滤命令:
bazel test //java/... --test_size_filters=small # 仅单元测试(无浏览器) bazel test //java/... --test_size_filters=large # 所有浏览器测试浏览器标签过滤则决定针对哪个浏览器运行:
bazel test //java/... --test_tag_filters=chrome # 只跑 chrome 测试 bazel test //java/... --test_tag_filters=remote-browser # 所有在 grid 上运行的浏览器测试 bazel test //java/... --test_tag_filters=-safari # 用 `-` 前缀排除某个标签两点限制需要注意,均来自 README:
- 同时出现多个
--test_tag_filters时,只有最后一个生效,若同时使用了继承的 config 要特别小心; --pin_browsers=false表示改用 Selenium Manager 查找浏览器/驱动,与默认的固定版本策略二选一。
结果判断:输出、重跑与 Linux 无显示环境
bazel test本身会对每个目标给出 PASSED/FAILED 结论;要看具体输出,用--test_output=all(结束后显示全部输出)或--test_output=streamed(实时显示,但会禁用并行)。结果被缓存而未真正执行时,加--cache_test_results=no强制重跑(AGENTS.md)。
在 Linux 上,Bazel 默认在当前 X 服务器上运行浏览器测试。若没有图形会话,README 给出的做法是起一个虚拟 X 服务器:
Xvfb :99 DISPLAY=:99 jwm bazel test --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome或者用 Bazel 的--run_under功能让xvfb-run前置执行:
bazel test --run_under="xvfb-run -a" //java/...跳过注解:按浏览器控制测试运行
测试类继承JupiterTestBase,使用 JUnit 5(Jupiter)与 AssertJ 断言(java/TESTING.md)。跳过机制由 JUnit 注解实现,注解接受value(浏览器)和reason,一行一个浏览器。浏览器取值:CHROME、EDGE、FIREFOX、SAFARI、IE,默认ALL。
两种跳过注解(java/TESTING.md):
| 注解 | 用途 |
|---|---|
@Ignore | 测试对某浏览器不可用。还可接受issue(GitHub issue,如"#1234")和gitHubActions(只在 CI 上跳过)。 |
@NotYetImplemented | 功能尚未实现。测试始终运行:失败时按通过处理,若意外通过则报错,以便移除该注解。 |
仓库中的真实用法,如 java/test/org/openqa/selenium/AlertsTest.java:
@Ignore(value = CHROME, reason = "Hangs") @Ignore(value = EDGE, reason = "Hangs")以及 java/test/org/openqa/selenium/ClickScrollingTest.java 中的issue参数:
@Ignore(value = IE, issue = "716")与 driver 生命周期相关的注解(同样接受value和reason)配合共享的driver使用,因为同一个driver在测试之间被复用(java/TESTING.md):
| 注解 | 用途 |
|---|---|
@NeedsFreshDriver | 测试需要干净的浏览器状态,测试前重启 driver。 |
@NoDriverBeforeTest | 测试需要自定义 capabilities 或测试 driver 创建本身;driver 会被销毁,测试内需用createNewDriver(capabilities)自建。 |
@NoDriverAfterTest | 测试会把浏览器留在糟糕状态,测试后重启 driver。还可接受failedOnly。 |
新建测试时,测试 HTML 页面放在common/src/web/,页面 URL 取自java/test/org/openqa/selenium/testing/Pages.java的pages字段,并有两个预配置的等待方法(5 秒与 10 秒)(java/TESTING.md):
class MyFeatureTest extends JupiterTestBase { @Test void testBasicFunctionality() { driver.get(pages.xhtmlTestPage); wait.until(ExpectedConditions.titleIs("XHTML Test Page")); // 10s timeout shortWait.until(ExpectedConditions.elementToBeClickable(element)); // 5s timeout assertThat(driver.getTitle()).isEqualTo("XHTML Test Page"); } }需要同时开两个浏览器(如多用户场景)时,用localDriver = new WebDriverBuilder().get()创建第二个实例;赋给localDriver字段后测试结束会自动 quit。文档同时强调:用WebDriverBuilder(或createNewDriver(capabilities))而不是直接new ChromeDriver(),因为 builder 会遵循当前 Bazel 目标实际运行的浏览器,硬编码驱动会与当前目标冲突。
边界与限制
- 多个
--test_tag_filters参数只有最后一个生效(README)。 - 浏览器测试依赖本地 X 会话或虚拟 X 服务器,无显示环境的 Linux 机器需按上文配置
DISPLAY或使用--run_under="xvfb-run -a"。 --test_output=streamed会禁用并行执行,大批量运行时会明显变慢,调试单个目标时再使用。- 新增测试文件只要满足
*Test.java命名且位于含java_selenium_test_suite声明的目录下,一般无需改动 Bazel 文件;需要新浏览器组合时才涉及修改BUILD.bazel(java/TESTING.md)。
【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/selenium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考