Playwright locator.evaluateAll 如何返回使用节点 forEach 填充的地图

2024-03-16

我想抢夺所有人的财产<custom-tag>节点和子节点的内部文本类型<custom-text>或类型<custom-number>

devtools 中的简化版本是这样的


const headersMap = new Map();
var headers = Object.create(null);
document.querySelectorAll("h2").forEach(el => {
    
    headers[el.id] = el.innerText
    headersMap.set(el.id, el.innerText)    
});
console.log("h2 count > 2 === " , (headersMap.size>2))
console.table(Array.from(headersMap, ([name, value]) => ({ name, value })));

For the API测试页面 https://playwright.dev/docs/api-testing这看起来像这样

这是我的剧作家尝试

test('API Testing - H2 count greater than 2', async ({ }) => {     
    await test.step('API Testing - get titles', async() => {

        await page.goto('https://playwright.dev/docs/api-testing');
        
        const headersList = await page.locator('h2');
        var headersMap = await headersList.evaluateAll(node => {
            const headersMap = new Map();
            var headers = Object.create(null);
            headers[node.id] = node.innerText
            headersMap.set(node.id, node.innerText)    
            return headersMap;
        });
        await expect(headersMap.size).toBeGreaterThan(2);
        page.pause();
        
    });
});

但它报告说:

   Error: expect(received).toBeGreaterThan(expected)
   Matcher error: received value must be a number or bigint
   Received has value: undefined
      47 |             return headersMap;
      48 |         });
    > 49 |         await expect(headersMap.size).toBeGreaterThan(2);
         |                                       ^
      50 |         page.pause();

Question

  • 我如何创建一个对象,用 forEach 填充它并返回它?
  • 必须改变什么my_locator.evaluateAll()返回地图?

当你使用locator.evaluateAll() https://playwright.dev/docs/api/class-locator#locator-evaluate-all,您在回调中得到一个数组。我会调用参数nodes而不是node所以你很清楚你需要迭代它。

第二个问题:地图不容易序列化。尝试一下:

const m = new Map();
m.set("hello", "world");
console.log(m.get("hello")); // => "world"
console.log(JSON.stringify(m)); // => {}

所有传入和传出的数据evaluate调用将被反/序列化,这将破坏你的地图。除非你有一些令人信服的理由来使用地图,否则我只会使用一个普通的旧对象。

这是一种选择:

import {expect, test} from "@playwright/test"; // ^1.30.0

test("playwright docs page has correct headers", async ({page}) => {
  const url = "https://playwright.dev/docs/api-testing";
  await page.goto(url, {waitUntil: "domcontentloaded"});
  const headers = await page.locator("h2").evaluateAll(nodes =>
    Object.fromEntries(
      nodes.map(node => [node.id, node.textContent.trim()])
    )
  );
  const expected = {
    "writing-api-test": "Writing API Test​",
    "using-request-context": "Using request context​",
    "sending-api-requests-from-ui-tests": "Sending API requests from UI tests​",
    "reusing-authentication-state": "Reusing authentication state​",
    "context-request-vs-global-request": "Context request vs global request​",
  };
  expect(headers).toEqual(expected);
});

请注意,您不需要await一个定位器定义,只有一个操作。通常使用.textContent而不是.innerText。修剪 HTML 字符串以使其标准化。留意有趣的事情​&ZeroWidthSpace;这些标题中的 s (考虑仅抓取文本节点并忽略<a>)。无需await非定位器断言。

尽管如此,上述方法并不完全是最佳实践,因为它不使用网络优先 https://playwright.dev/docs/best-practices#use-web-first-assertions断言。我会重写它以使用.toHaveText()直接在定位器上。

await expect(page.locator("h2")).toHaveText([
  "Writing API Test​",
  "Using request context​",
  "Sending API requests from UI tests​",
  "Reusing authentication state​",
  "Context request vs global request​",
]);

id 可以单独测试,而且可能并不那么重要。你可以poll https://playwright.dev/docs/test-assertions#polling or retry https://playwright.dev/docs/test-assertions#retrying等待谓词为真作为最后的手段,但如果你确定这些总是静态地出现在页面上,那么打破网络优先规则可能是可以的。

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

Playwright locator.evaluateAll 如何返回使用节点 forEach 填充的地图 的相关文章

  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • ReferenceError:regeneratorRuntime未定义(但在范围内工作)

    我遇到过这种奇怪的情况 ReferenceError regeneratorRuntime is not defined 我已经设法在一个非常小的设置中重现 与同一问题上的类似问题相比 并且还注意到一些奇怪的行为 具体取决于是否使用范围 以
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar

随机推荐