0

我正在尝试根据表亲的字符串值获取电话号码。

我的目标是搜索“所有者”并最终得到电话号码的值。

<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);
4

1 回答 1

2

有一些问题:

  1. page.$()需要一个 CSS 选择器,而不是 XPath。
  2. page.$x()将返回一个带有 ElementHandle-s 的数组。
  3. ElementHandle-s 具有与 DOM 元素不同的属性,我们需要使用更复杂的 API 来获取它们。
  4. 我无法让 puppeteer 创建一个a带有 href 的元素'#',只能使用完整的 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);
  }
})();
于 2020-10-07T07:16:19.020 回答