没有找到选择器的节点,但选择器在 HTML 页面上

Posted

技术标签:

【中文标题】没有找到选择器的节点,但选择器在 HTML 页面上【英文标题】:No node found for selector, but selector is there on HTML page 【发布时间】:2019-04-08 10:38:42 【问题描述】:

我在尝试使用 Puppeteer 在输入字段中输入文本时遇到了一些问题。这是我正在使用的网站的 html,它显示该字段的 idcreditCardNumber

当我尝试使用page.focuspage.type 时,它说没有选择器节点。这段代码是错误的,还是有更好的办法?

await page.waitFor(1500);
await page.focus('#creditCardNumber');
await page.focus('#creditCardNumber', '1234', delay: 5);

这是我得到的错误:

UnhandledPromiseRejectionWarning:错误:找不到选择器的节点:#creditCardNumber

【问题讨论】:

Do not post images of code or errors! 图片和屏幕截图可以很好地添加到帖子中,但请确保帖子在没有它们的情况下仍然清晰有用。如果您发布代码或错误消息的图像,请确保您还复制并粘贴或直接在帖子中输入实际代码/消息。 【参考方案1】:

当您尝试聚焦时,DOM 元素可能不会被渲染。

尝试在page.focus 调用之前使用page.waitForSelector

await page.waitFor(1500);
await page.waitForSelector('#creditCardNumber');
await page.focus('#creditCardNumber');
await page.focus('#creditCardNumber', '1234', delay: 5);

【讨论】:

当我尝试得到这个错误时:TimeoutError: waiting for selector "#creditCardNumber" failed: timeout 30000ms exceeded 这意味着你的 DOM 元素没有被渲染或者它在 iFrame 中。对于 iFrame,您可以使用 page.frames 找到它,然后使用您的选择器在 iFrame 元素上调用 frame.focus 我已经尝试过但没有任何效果,我该怎么做? 如果你尝试了这两个选项,那么你的元素可能没有被渲染,你需要找出原因:(【参考方案2】:

您需要等待使用page.waitForSelector()#creditCardNumber 元素添加到DOM。

由于you are receiving a TimeoutError,您可以使用timeout 选项延长(甚至禁用)最大导航时间:

await page.waitForSelector('#creditCardNumber', timeout: 60000);

此外,您似乎正在尝试使用page.focus() 在输入字段中输入内容,但您应该改用page.type()

await page.type('#creditCardNumber', '1234', delay: 5);

因此,您的新代码应如下所示:

await page.waitForSelector('#creditCardNumber', timeout: 60000);
await page.type('#creditCardNumber', '1234', delay: 5);

此外,您还可以使用elementHandle.type() 来进一步简化您的代码:

const credit_card_number = await page.waitForSelector('#creditCardNumber', timeout: 60000);
await credit_card_number.type('1234', delay: 5);

注意:如果您在上述更改后仍然收到TimeoutError,您可能需要检查page.content() 或截取带有page.screenshot() 的页面以验证页面正在返回您期望的结果。

【讨论】:

以上是关于没有找到选择器的节点,但选择器在 HTML 页面上的主要内容,如果未能解决你的问题,请参考以下文章

到处都是jQuery选择器的年代,不了解它们的性能,行吗?

CSS 选择器

JQuery 在嵌套元素上查找没有选择器的文本节点仅适用于 .contents() 和 filter()

Jquery学习笔记一

使用 css 类选择器在角度组件上传递输入属性

CSS3中的选择器