木偶:等待xpath示例

时间:2020-06-11 08:48:29

标签: web-scraping puppeteer

所以我是Puppeteer的新手,我正在尝试编写如下语法: 我有一个列表,每个li的ID相同,因此我尝试查找特定的文本,然后单击该文本。到目前为止,我有以下代码:

  await page.waitFor(5000)

  const linkEx = await page.$x("//a[contains(text(), 'Shop')]")

  if (linkEx.length > 0) {
    await linkEx[0].click()
  }

您知道如何将第一行替换为等待实际的文本“ Shop”吗? 我尝试了await page.waitFor(linkEx),waitForSelector(linkEx),但是它不起作用:(

此外,我想用实际的ID(#activities)或类似的东西替换第二行代码中的a,但我找不到合适的示例。

您能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

page.waitForXPath在这里需要什么。

示例:

const puppeteer = require('puppeteer')

async function fn() {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://example.com')

  // await page.waitForSelector('//a[contains(text(), "More information...")]') // ❌
  await page.waitForXPath('//a[contains(text(), "More information...")]') // ✅
  const linkEx = await page.$x('//a[contains(text(), "More information...")]')
  if (linkEx.length > 0) {
    await linkEx[0].click()
  }

  await browser.close()
}
fn()

对于基于ID的xpath,请尝试以下操作:

"//*[@id='activities' and contains(text(), 'Shop')]"

您知道吗?如果在Chrome DevTools的“元素”选项卡中右键单击一个元素,然后选择“复制”:您可以在其中复制元素的确切选择器或xpath。之后,您可以切换到“控制台”选项卡,并使用Chrome api可以测试选择器的内容,因此可以为操纵up脚本做好准备。例如:$("//*[@id='activities' and contains(text(), 'Shop')]").href应该显示链接您希望单击的内容,否则您需要更改访问权限,或者需要检查是否有更多具有相同选择器的元素,等等。这可能有助于找到更合适的元素选择器。