【问题标题】:Puppeteer (1.14.0) unable to find anchor tag by "id" although JQuery can find itPuppeteer (1.14.0) 无法通过“id”找到锚标记,尽管 JQuery 可以找到它
【发布时间】:2019-04-12 23:42:20
【问题描述】:

节点 v10.15.3(64 位) 木偶师 v1.14.0 Chromium v​​ 75.0.3738.0(开发者构建)(64 位)

我在站点自动化工具的最后一页,Puppeteer 找不到我需要按下的最后一个按钮(实际上是一个带有“id”属性的锚标记)。代码是:

await page2.click('#____bs');

我收到的错误是:

错误:节点不可见或不是 HTMLElement

HTML 代码在这里:

<a role="button" ct="Button" rel="tooltip" title="Post" 
    aria-label="Please Select Post" data-toggle="cso-button" id="____bq" 
    class="cso-btn cso-btn cso-action cso-corner cso-btn-primary     " 
    href="javascript:void(0)" 
    data-ctl-options="{'actiontype';:'ACTION','value':'Click'}" 
    style="display: inline-block;">Post</a>

当页面处于调试模式时,我可以使用 JQuery 轻松找到元素:

$("#____bq").text()
"Post"

那么,为什么Puppeteer 找不到呢?有没有其他方法可以尝试点击此链接?

是否也可能是控件(锚点)位于屏幕的可见边缘之外?我认为这并不重要,因为我假设 Puppeteer 正在查看 HTML 而不是屏幕本身,但问一下也无妨。

提前致谢。

更新:这是包含我要选择的锚点的整个 HTML:

    <div class="row split">
        <div class="clsFP-expand clsBG-expand cso-hidden cso-cont-50r cso-pad5r">
            <span class="cso-pad5-ie">
    <a role="button" ct="Button" rel="tooltip" title="Cancel" aria-label="Please Select Cancel" data-toggle="cso-button" id="____bo" class="cso-btn cso-btn cso-action cso-corner cso-btn-grey     " href="javascript:void(0)" data-ctl-options="{&quot;actiontype&quot;:&quot;ACTION&quot;,&quot;value&quot;:&quot;Click&quot;}" >Cancel</a>

</span>
            <span class="cso-pad5-ie">
    <a role="button" ct="Button" rel="tooltip" title="Post" aria-label="Please Select Post" data-toggle="cso-button" id="____bs" class="cso-btn cso-btn cso-action cso-corner cso-btn-primary  inactive   " href="javascript:void(0)" data-ctl-options="" >Post</a>


    <a role="button" ct="Button" rel="tooltip" title="Post" aria-label="Please Select Post" data-toggle="cso-button" id="____bq" class="cso-btn cso-btn cso-action cso-corner cso-btn-primary     " href="javascript:void(0)" data-ctl-options="{&quot;actiontype&quot;:&quot;ACTION&quot;,&quot;value&quot;:&quot;Click&quot;}" >Post</a>

</span>
        </div>
    </div>

【问题讨论】:

  • 您的 Puppeteer 代码引用 id 为 ___bs,而您的页面包含 id 为 ___bq。哪个是正确的?
  • 好收获。奇怪的是,这个页面有两个用于“发布”“按钮”的锚标签,一个是“____bq”,另一个是“____bs”。这是第三方软件,所以我不确定有什么区别。在任何事件,当我在 Chrome 中并使用按钮上的“复制选择器”时,它是“____bq”。很抱歉造成混淆。

标签: selector puppeteer


【解决方案1】:

并不是 Puppeteer 无法获取元素。这是来自 Puppeteer 的验证(请参阅 https://github.com/GoogleChrome/puppeteer/blob/5ee21d97e796263857b9f3fbeaf63366179d346f/lib/JSHandle.js#L203)。

根据文档:

此方法使用选择器获取元素,如果需要将其滚动到视图中,然后使用 page.mouse 在元素中心单击。如果没有元素匹配选择器,该方法会抛出错误。

这意味着 Chromium 应该能够滚动到该元素,并且该元素应该是可见的,以便能够点击它。

【讨论】:

  • 首先,感谢您的快速反馈(对你们俩)。对于您的回应,hardkoded,我已经完全最大化地启动 Chromium,并且我已经将 headless 变为 false,因此我可以看到正在发生的事情,并且我肯定可以看到按钮。我现在想知道如果我注入 JQuery(至少在控制台中工作)来查找元素并单击它,那会工作吗?
  • 是的,您可以通过evaluate 使用jQuery。这不会模拟鼠标点击。
  • 我添加了围绕我要访问的锚标记的代码。不确定 DIV/SPAN 是否与该问题有关,但如果确实如此,我已经添加了代码。再次感谢您的帮助(你们俩)。
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2012-06-02
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多