如何 select 表弟的内部文本使用 puppeteer

How to select inner text of cousin using puppeteer

我正在尝试根据表亲的字符串值获取 phone 数字。

我的目标是搜索“所有者”并以 phone 号码的值结束。

<div>
    <h3>
        <a href="#">Owner</a>
    </h3>
    <p>
        (555) 555-5555
    </p>
</div>

这是我目前所拥有的,但我不断得到 undefined。你能解释一下我做错了什么吗?

console.log(await this.page.$("//h3[contains(a, 'Owner')]/../p").innerText);

存在一些问题:

  1. page.$() 需要一个 CSS 选择器,而不是 XPath。
  2. page.$x() 将 return 一个包含 ElementHandle-s.
  3. 的数组
  4. ElementHandle-s 与 DOM 元素没有相同的属性,我们需要使用更复杂的 API 来获取它们。
  5. 我无法让 puppeteer 使用 '#' href 创建一个 a 元素,只能使用完整的 URL,但这可能是一个测试用例问题。

这对我有用:

const html = `
  <!doctype html>
  <html>
    <head><meta charset='UTF-8'><title>Test</title></head>
    <body>
      <div>
          <h3>
              <a href="http://example.com/">Owner</a>
          </h3>
          <p>
              (555) 555-5555
          </p>
      </div>
    </body>
  </html>`;

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto(`data:text/html,${html}`);

    const data = await (
      await (
        await page.$x("//h3[contains(a, 'Owner')]/../p")
      )[0].getProperty('innerText')
    ).jsonValue();
    console.log(data);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();