这是 ChromeDriver 91 的问题,首先在Chromium 错误跟踪器2021 年 5 月 3 日。
我已经更详细地描述了问题和可能的解决方案/解决方法本文.
简而言之,Chromium 团队认为最近的变化ChromeDriver 属性端点对 ChromeDriver 的行为产生了负面影响GetElementAttribute
命令,现在导致WebElement.getAttribute
方法返回null
而不是属性的实际值。
该问题影响使用的工具JsonWireProtocol
, 例如硒网络驱动程序 3,量角器使用在引擎盖下.
Chromium团队推荐的解决方案是使用Selenium WebDriver 4,并且有一个持续的努力让 Protractor 也使用它(如果您在 GitHub,请考虑投票支持此票)。需要注意的是 Selenium WebDriver 4弃用了许多 API,因此需要更新测试以避免使用这些(即browser.actions()
).
与 Selenium WebDriver 3 兼容的修复也已被提议,但在撰写本文时(2021 年 6 月 8 日)尚不可用。
如果您想在官方修复可用之前将 Chromium/ChromeDriver 91 与 Protractor 一起使用,您有以下三种选择:
使用W3C协议
您可以在以下位置显式启用对 W3C 协议(而不是受影响的 JsonWireProtocol)的支持:protractor.conf.js
:
capabilities: {
'browserName': 'chrome',
'goog:chromeOptions': {
w3c: true,
args: [
'--headless',
]
},
}
Warning:一些API,例如browser.actions()
与 W3C 模式不兼容,并且在启用此模式时将中断。
回退到注入 JavaScript
您可以将测试更改为在以下情况下回退到通过 JavaScript 检索属性值:getAttribute()
回报null
.
const attribute = await element.getAttribute(name).then(value => {
if (value !== null) {
return value;
}
return browser.executeScript(`
function getAttribute(webElement, attributeName) {
return webElement.getAttribute(attributeName);
})
`, element, name);
})
这类似于如何Serenity/JS 验收测试框架可以在引擎盖下.
将 Protractor 与 Serenity/JS 结合使用
我已经实施了上述回退策略宁静/JS(查看GitHub),因此,如果您将 Protractor 与 Serenity/JS 一起使用,则需要更新任何@serenity-js/*
模块到版本2.29.0它只适用于 Chromium 91。
例如,如果您有一个像这样的小部件:
<input type="checkbox" id="confirm" />
使用 Serenity/JS 和 Protractor,您可以检索任何小部件的属性,如下所示:
import { actorCalled } from '@serenity-js/core';
import { Ensure, equals } from '@serenity-js/assertions';
import { Target } from '@serenity-js/protractor';
import { by } from 'protractor';
const confirmation = Target.the('confirmation checkbox')
.located(by.id('confirm'));
// in the test:
actorCalled('Alice').attemptsTo(
Ensure.that(
Attribute.of(confirmation).called('checked'),
equals('true')
),
);
要开始使用 Serenity/JS 和 Protractor:
- 看看介绍视频
- 看看示例项目在 GitHub 上
- 提出任何问题社区聊天
- 或者在 StackOverflow 上,用以下标签标记它们
[serenity-js]
完全公开,我是 Serenity/JS 的作者