关于 Puppeteer xpath 元素评估的问题

Question about Puppeteer xpath element evaluation

我正在编写一些人偶代码,运行 解决了一个我希望更好地理解的问题。

在使用 XPath 时,我无法理解这段代码为何有效:

   await page.goto(url)
   //identify element with absolute xpath then click
   const b = (await page.$x("<absolute XPath>"))[0]
   //Works!
   b.click()

   //But this won't work
   const b = (await page.$x("<absolute XPath>"))
   b.click()

   //And this won't work
   b.click()
   const b = await page.$x("<absolute XPath>")

为什么将 await page.$x 语句括在括号中有效?那里发生了什么?

当我删除括号、删除数组索引、任何更改...等等...然后我得到标准错误,例如“click is not a function of b”。我的印象是我正在评估一个绝对的 XPath ......一个单一的元素。数组从何而来?当将整个事物包装在括号中并指定数组元素时,会发生什么,它可以完美地直接计算出我想要的元素而没有任何问题?

将不胜感激任何见解或正确信息的链接。我希望这不是我在文档中遗漏的内容

不是parenthesis而是[0]改变了一切。

xpath 可以找到很多元素,所以它总是 returns list/array - 即使它只找到一个元素或什么都找不到 - 你必须使用 [0] 来获得列表中的第一个元素。或者您可以使用其他索引从列表中获取其他元素(如果列表更长)。 (当然列表也可以为空,[0]可能会报错)

你做不到 list.click()。您必须执行 first = list[0],然后再执行 first.click()。或者您可以使用 forEach 对列表中的所有元素执行 click

它只需要 parenthesis 以正确的顺序执行命令 - 首先 await,然后 [0]

如果你不使用 parenthesis 那么它会先尝试执行 [0] 然后再执行 await.

所以你可以在更多行上重写它

const all_results = await page.$x("<XPath>")

const first = all_results[0]

first.click()

或写得更短

const all_results = await page.$x("<XPath>")

all_results[0].click()

const first = (await page.$x("<XPath>"))[0]

first.click()

如果您要使用 console.log(b) 那么您应该在不同版本中看到您在这个变量中真正拥有的内容。


顺便说一句:

同样可以使用 CSS 选择器 - page.$("<css selection>") - 它也 returns list/array.


编辑:

正如@ggorlen 他在评论中提到的,您可以使用左侧大小的数组分配第一个元素

[first] = await page.$x("<XPath>")

first.click()