关于 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()
我正在编写一些人偶代码,运行 解决了一个我希望更好地理解的问题。
在使用 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()