铬版本更新后量角器问题



我刚刚更新了铬版本;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模式下运行命令。记住

最新更新