我刚刚更新了铬版本;getAttribute"总是返回null,有人知道为什么吗?(在此更新之前运行良好(
CHROMIUM_REVISION=884014
element(by.id(elementId)).getAttribute('value').then((value) => {
console.log(value); // <-- null
});
这是ChromeDriver 91的一个问题,于2021年5月3日在Chromium bug跟踪器中首次报告。
我在这篇文章中更详细地描述了这个问题和可能的解决方案/解决方法。
简而言之,Chromium团队认为,最近对ChromeDriver属性端点的更改对GetElementAttribute
命令的行为产生了负面影响,这导致WebElement.getAttribute
方法返回null
,而不是属性的实际值。
该问题影响了使用JsonWireProtocol
的工具,例如Protractor在后台使用的Selenium WebDriver 3。
Chromium团队建议的解决方案是使用Selenium WebDriver 4,目前正在努力让Protractor也使用它(如果你在GitHub上,请考虑投票支持这张票(。需要注意的是,Selenium WebDriver 4弃用了许多API,因此需要更新测试以避免使用这些API(即browser.actions()
(。
Selenium WebDriver 3兼容的修复程序也已提出,但在撰写本文时(2021年6月8日(尚不可用。
如果你想在正式修复之前将Chromium/ChromeDriver 91与Protractor一起使用,你有三种选择:
使用W3C协议
您可以在protractor.conf.js
:中显式启用对W3C协议的支持(而不是受影响的JsonWireProtocol(
capabilities: {
'browserName': 'chrome',
'goog:chromeOptions': {
w3c: true,
args: [
'--headless',
]
},
}
警告:某些API(如browser.actions()
(与W3C模式不兼容,并且在启用此模式时会中断。
回退到注入JavaScript
当getAttribute()
返回null
时,您可以将测试更改为通过JavaScript检索属性值。
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验收测试框架在后台所做的工作。
使用Serenity/JS的Protractor
我已经在Serenity/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 的作者
这就是的工作原理
我找到了一个临时解决方案,它只适用于mac 上的chrome91.0.4472.114
这里描述的问题实际上是chromedriver中的一个错误https://bugs.chromium.org/p/chromium/issues/detail?id=1205107所以这不是Protractor问题,只是问题
在开发过程中,您可以使用chromedriver版本90。工作起来很有魅力。此处提供最新版本https://chromedriver.storage.googleapis.com/LATEST_RELEASE_90.0.4430
你可以通过运行这个命令来降级chromedriver
webdriver-manager update --gecko=false --versions.chrome 90.0.4430.24
请注意,有时您会安装全局、项目本地和特定于Protractor的网络驱动程序管理器。我给出的命令将在全球范围内安装chromedriver。为了在本地安装,您需要找到Web驱动程序管理器的路径,并运行类似的命令
node ./node_modules/protractor/node_modules/webdriver-manager update --gecko=false --versions.chrome 90.0.4430.24
你们中的一些人可能需要在sudo
模式下运行命令。记住