javascript - NightmareJS : “Failed to execute ' querySelector' on 'Document' : '#LINK1$1' is not a valid selector.”

标签 javascript nightmare

我正在使用NightmareJS抓取一个网站以获取数据,并且该网站使用id来 anchor 定标签,其方式类似于下面的代码。

<div>
    <a id="#LINK1$1"></a>
</div>

我正在尝试使用'.click(Selector)'方法,该方法默认使用querySelector,但是我似乎无法通过id获得 anchor 标记。
我都尝试过
.click('#LINK1$1'),
.click('\u{0023}LINK\u{0031}\u{0024}\u{0031}')

但是它们都导致相同的错误
"Failed to execute 'querySelector' on 'Document': '#LINK1$1' is not a valid selector."

我该怎么办?

最佳答案

您可以使用Xpath方法来执行此操作。 Puppeteer具有xpath功能。

理论

根据他们的文档,

page.$x(expression)
expression <string> Expression to evaluate.
returns: <Promise<Array<ElementHandle>>>
The method evaluates the XPath expression.

它将返回一个元素数组。我们可以根据需要click它们。

实践

获取元素的xpath,
enter image description here

现在应用
// we execute the xpath
const elems = await page.$x(`//*[@id="#LINK1$1"]`)

// We click the first element, since it returns an array
await elems[0].click();

完毕!

顺便说一句,这也适用于浏览器,
function getElementByXpath(path) {
  return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
getElementByXpath(`//*[@id="#LINK1$1"]`)
// >> Returns single node <a id=​"#LINK1$1">​Test​</a>​

关于javascript - NightmareJS : “Failed to execute ' querySelector' on 'Document' : '#LINK1$1' is not a valid selector.”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635994/

相关文章:

javascript - 是什么阻止 .row div 滚动?

javascript - 在 Laravel 中将 php var 传递给 javascript

javascript - 如何根据 Nightmare 中的情况做某事?

javascript - Nightmare.js 在 Ubuntu Linux 云服务器上没有按预期工作

javascript - 调用 $ ("#form").submit(... 没有执行任何操作

javascript - 文档就绪函数内的全局范围

node.js - 尽管使用与集线器所示相同的Dockerfile,但重建Docker镜像失败

javascript - NightmareJS wait(selector) 不适用于基于 dojo 的网页

node.js - NightmareJS脚本执行错误

javascript - (AngularJS) 全局替换数组中的值的最有效方法