更新 chromium 版本后量角器问题

2023-12-02

我刚刚更新了我的 chromium 版本,“getAttribute”总是返回 null,有人知道为什么吗? (在此更新之前工作正常)

CHROMIUM_REVISION=884014

element(by.id(elementId)).getAttribute('value').then((value) => {
                console.log(value); // <-- null
            });

这是 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 的作者

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新 chromium 版本后量角器问题 的相关文章

随机推荐

  • 在 WinRT 和 C# 中使用 HttpRequestHeaders

    我正在使用 HttpWebRequests 联系 API 需要添加标头 但编译器告诉我该方法不存在 然而 当我查看 MSDN 时 它告诉我该方法已经存在 设置我的 UserAgent 属性也失败 有人可以帮我吗 try HttpWebReq
  • 如何使用 SSIS 将大型平面文件加载到数据库表中?

    我不确定它是如何工作的 所以我正在寻找正确的解决方案 我认为 SSIS 是正确的方法 但我以前从未使用过它 设想 每天早上 我都会收到一个包含 800K 记录的制表符分隔文件 我需要将其加载到我的数据库中 从 ftp 或本地获取文件 Fir
  • 在浏览器中 Flash 至全屏

    如何使我的 Flash 应用程序在浏览器中处于全屏模式 我知道舞台可以置于该模式 但是当我在任何浏览器中运行应用程序时 这不起作用 那么 这是可以做到的 但是如何做到呢 在包含 Flash SWF 的 HTML 中 将以下参数添加到 标记中
  • 我应该如何使用 Django 中的电子签名 Web 应用程序的邀请和收件人来构建数据库实体?

    我有兴趣为我的电子签名 Web 应用程序实现以下要求 用户可以创建新的签约合同 该合同可以包括多个用户来签署 合约创建者需要提供emails的收件人 每个收件人都会分配额外的数据 例如签名详细信息 说明等 但是 受邀请的用户仍然可以系统中不
  • 为 XNA 游戏实现简单的基于 XML 的脚本语言

    我正在与一个团队合作使用 C 和 XNA 开发 RPG 引擎 我们计划针对 Windows 和 Windows Phone 7 但在过场动画期间遇到 AI 交互和控制玩家操作的问题 大多数情况下 所有内容都是使用 MVC 设计模式提取的 但
  • 在公共块中拥有全局变量是未定义的行为吗?

    0 c int i 5 int main return i 1 c int i 上面编译得很好gcc 0 c 1 c没有任何链接错误multiple definitions 原因是i生成为common blocks fcommon whic
  • ASP.NET MVC 中使用 SSL 操作过滤器重定向循环

    我正在使用 ActionFilter 见下文 来检测 1 当前控制器 操作是否需要 SSL 以及 2 当前正在使用 SSL 并相应地重定向 这在本地工作正常 在 IIS 7 中使用虚拟证书 但是一旦我在服务器上启动它 我就会收到一条错误 指
  • 在 Android 中发送 HTML 格式的电子邮件

    我已经成功创建了一个 Android 应用程序 它可以计算价格 然后能够以预先格式化的方式将该数据传输到用户选择的电子邮件程序 根据用户在应用程序中创建的数据 包含 HTML 的字符串将被读入意图 我为此的代码是 final Intent
  • 模拟使用外部类的方法,mockito

    我对mockito很陌生 只是想了解它是如何工作的 我有一个方法想要测试 该方法实例化多个类以使用其方法 e g methodToTest class1 c1 new class1 class2 c2 new class2 class3 c
  • TypeScript 条件返回值类型?

    function f x boolean string return x f true boolean string 为什么打字稿不能理解返回值是布尔值 function f x boolean string return typeof x
  • 如何将多维数组传递到 CodeIgniter 中的视图

    这真是让我抓狂了 我将多维数组传递给这样的视图 res this gt deliciouslib gt getRecentPosts 正如你所看到的 这是我正在使用的美味 API result 是一个数组 print r result 给出
  • 同步异步队列

    我计划有一个基于异步队列的生产者 消费者实现来处理实时数据 其中以正确的时间顺序发送数据至关重要 这是它的代码片段 async def produce Q n jobs for i in range n jobs print f Produ
  • 你建议不要使用基于 javascript 的 LESS 吗?

    After I 观看了这个 NetTUTs 视频 我对尝试所示的 LESS js 方法非常感兴趣 除了显而易见的问题之外 如果用户没有启用 javascript 怎么办 或 性能将会受到轻微影响 这是否有原因不能在生产中使用 LESS 本质
  • 如何强制多态中的隐式转换?

    请考虑这个例子 我们如何在第二个参数是指向成员函数的指针的函数中强制隐式转换 在函数的参数列表中显式转换并不是我现在想要实现的目标 相反 我希望编译器以某种方式这样做 就像使用第一个参数一样 struct Base virtual Base
  • java.lang.NoClassDefFoundError:android.support.v7.appcompat.R$styleable

    我正在使用终端 不是 eclipse 我在使用时遇到以下异常错误emulator debug成功并安装成功 但模拟器显示Unfortunatly app has stop 然后我跑 adb logcat它将显示以下内容 java lang
  • Eclipse 变得疯狂(自从 SDK Lollipop 更新以来)

    我好几天都写不出代码了 当我尝试编辑布局时 Eclipse 通常会返回此错误 并创建新项目 新的 xml 文件 尝试运行项目 解析Sdk内容失败java lang ExceptionInInitializerError 解析Sdk内容失败无
  • C 中 *myptr++ 和 *(myptr++) 有什么区别

    我正在使用C 假设我有一个指向名为 myptr 的整数的指针 int myptr 那么以下之间有什么区别 myptr and myptr 谢谢 担 Since 优先级高于 有没有不同两者之间
  • PHP 5.2.14 的 DateTime::CreateFromFormat [重复]

    这个问题在这里已经有答案了 我使用以下代码将用户输入转换为 mysql 时间戳 datetime DateTime createFromFormat m d Y g i a exp timestamp datetime gt format
  • 使用 Google Calendar API (PHP) 插入包含非 ASCII 字符的事件

    我在使用 Google Calendar API PHP v3 插入事件时遇到问题 如果事件的说明包含井号 等字符 则会在日历中创建该事件 但说明留空 似乎对于初始 7 位字符代码 ASCII 代码 0 127 之外的所有字符都是如此 通过
  • 更新 chromium 版本后量角器问题

    我刚刚更新了我的 chromium 版本 getAttribute 总是返回 null 有人知道为什么吗 在此更新之前工作正常 CHROMIUM REVISION 884014 element by id elementId getAttr