【问题标题】:Puppeteer. Cannot get node property in evaluate()傀儡师。无法在评估()中获取节点属性
【发布时间】:2019-10-08 09:58:43
【问题描述】:

如何在 puppeteer 中找到一个不起眼的单选按钮元素并单击它?

我看到很多文章说,“只需使用评估()然后单击它”或类似的,这在我的场景中不起作用。

这是我所拥有的:

page.on('console', consoleObj => console.log(consoleObj.text()));

await page.evaluate(() => {
    let container = document.getElementById('container');
    let options = container.getElementsByClassName('labels');

    // OPTIONS GIVES ME AN ARRAY OF JSHandle@node.

    if (options.length > 0) {
        for (let radio of options) {
            let value = radio.value;
            console.log(value);
        }
    }
});

我不知道该怎么办。值始终为空。

我需要知道它的value 才能知道是否点击它。我打算传入一个变量进行评估,然后根据该变量单击正确的变量。

如果我只是将 radio.click() 放在 for 循环中,它的工作原理是它单击每个元素并始终在最后一个被选中的元素上结束。所以我知道click() 有效。如何确定点击哪个并选择它?

以下是 HTML 格式的 2 个单选按钮元素:

<input name="choice" value="accept" class="checkbox" type="radio">

<input name="choice" value="reject" class="checkbox" type="radio">

【问题讨论】:

  • 你的收音机有类复选框,但你循环的元素有类标签
  • 天哪。我花了 2 个小时查看这个谷歌搜索所有可能的答案。你是绝对正确的。它循环标签,而不是包含输入。我一直在阅读for (let radio of options),因为它是里面的单选按钮。结尾 。我。
  • 我认为通过单击包含标签会使事情变得更糟,但它仍然选中了单选按钮。向我确认这是单选按钮。
  • 有时我们已经习惯了我们正在寻找的代码,以至于我们看不到这些简单的东西。

标签: javascript node.js puppeteer


【解决方案1】:

为什么不使用 getElementsByName?

page.on('console', consoleObj => console.log(consoleObj.text()));

await page.evaluate(() => {
    let options = container.getElementsByName('choice');

    if (options.length > 0) {
        for (let radio of options) {
            let value = radio.value;
            console.log(value);
        }
    }
});

【讨论】:

  • 这确实解决了我的问题,但这不是问题背后的原因。请参阅上面@Ramon Portella 的 cmets。无论如何都会将其标记为答案,因为从技术上讲这现在有效。
  • 是的,他部分正确,应该把他的评论作为答案:-)
  • 太专注于来自错误节点的控制台日志,以至于我最终深入研究了 JSHandles,并花了很多时间弄清楚它们是什么以及为什么要使用它们。我想这并不完全是浪费时间,因为我学到了一些新东西:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多