假设您正在使用PlayWright来验证一些如下所示的HTML:

<span>
  时间是:
  <time>5:30 pm</time>
</span>

你可以使用这个代码:

page.locator('span', {has: page.locator('time')}).textContent();

要实现以下目标:

时间是:下午5:30

但是,如果你just想要第一部分,因为它不会改变呢?

时间是:

有没有办法在不获取其子元素文本的情况下获取元素的文本内容?

目前,我能想到的唯一解决方案是获取两者的文本,然后删除子元素的文本:

const parent = page.locator('span', {has: page.locator('time')});
const parentText = parent.textContent();
const child = parent.locator('time');
const childText = child.textContent();
const onlyParentText = parentText(0, parentText.length - childText.length);

...但仅获取单个DOM node 的文本就需要大量的JavaScript.

有没有更简单的方法来使用编剧功能来完成上面的工作?

推荐答案

我不认为剧作家有这样的天赋,所以进入evaluate可能是最好的方法:

const text = await page
  .locator("span", {has: page.locator("time")})
  .evaluate(el => el.firstChild.textContent);

为了将其推广到具有多个文本 node 或父 node 内的任意位置的情况,

const text = await page
  .locator("span", {has: page.locator("time")})
  .evaluate(el =>
    [...el.childNodes]
      .filter(e => e.nodeType === Node.TEXT_NODE)
      .map(e => e.textContent)
  );

预计会根据需要对文本进行裁剪和连接.例如:

const playwright = require("playwright"); // ^1.39.0

const html = `
<p>
  a <b>ignore this</b>
</p>
<p> b <b>ignore this</b> c </p>
<p> d <b>ignore this</b> e </p>`;

let browser;
(async () => {
  browser = await playwright.firefox.launch();
  const page = await browser.newPage();
  await page.setContent(html);
  const text = await page
    .locator("p")
    .evaluateAll(els =>
      els.map(el =>
        [...el.childNodes]
          .filter(
            e =>
              e.nodeType === Node.TEXT_NODE &&
              e.textContent.trim()
          )
          .map(e => e.textContent.trim())
      )
    );
  console.log(text); // => [ [ 'a' ], [ 'b', 'c' ], [ 'd', 'e' ] ]
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

作为mentioned in the comments,如果您在测试中断言,最好使用

await expect(locator).toHaveText(/^\s*The time is:/m);

Javascript相关问答推荐

如何通过onClick为一组按钮分配功能;

Vega中的模运算符

有条件的悲剧

拖放仅通过 Select 上传

JQuery. show()工作,但. hide()不工作

网页自检测外部元素无法加载

Mongoose post hook在使用await保存时不返回Postman响应

优化Google Sheet脚本以将下拉菜单和公式添加到多行

PDF工具包阿拉伯字体的反转数字

同一类的所有div';S的模式窗口

在VS代码上一次设置多个变量格式

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

有效路径同时显示有效路径组件和不存在的路径组件

每次重新呈现时调用useState initialValue函数

如何为仅有数据可用的点显示X轴标签?

P5.js中矩形内的圆弧

ComponentWillReceiveProps仍在React 18.2.0中工作

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

Played link-Initialize.js永远显示加载符号

将以前缓存的 Select 器与querySelector()一起使用