【问题标题】:How can I execute a __doPostBack function in puppeteer?如何在 puppeteer 中执行 __doPostBack 函数?
【发布时间】:2019-04-16 15:07:05
【问题描述】:

我正在尝试通过 __doPostBack 函数抓取需要单击页面按钮的网​​页。我在 chrome 控制台中尝试了以下代码。

javascript:__doPostBack('ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector','')

这行得通,我可以转到下一页。但是,我在将此命令传递给 puppeteer 时遇到了一些困难。我尝试了以下但没有成功。

await page.evaluate(() => { javascript:__doPostBack('ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector','');}) 

我还尝试通过将 __EVENTTARGET 值重置为来修改 aspnet 表单

'ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector'   

但这似乎还不够。感谢您的任何建议。

【问题讨论】:

  • javascript:__doPostBack( 这是一种从链接执行 javascript 的方法,您已经使用 page.evalulate 进入 javascript 领域,所以您是否尝试过只做 __doPostBack(
  • 试过了。但它说 __doPostBack 不是一个公认的功能。
  • 点击按钮,怎么样?

标签: javascript node.js web-scraping puppeteer


【解决方案1】:

问题是 ASP.NET 正在注册两个 __doPostBack 函数。

页面中的一个:


//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>

源脚本中的另一个

Sys.Extended.UI.ControlBase.__doPostBack = function(n, t) {
    if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack())
        for (var i = 0; i < Sys.Extended.UI.ControlBase.onsubmitCollection.length; i++)
            Sys.Extended.UI.ControlBase.onsubmitCollection[i]();
    Function.createDelegate(window, Sys.Extended.UI.ControlBase.__doPostBackSaved)(n, t)
};

当他们使用ControlBase 扩展window 时,您获得的__doPostBack 函数是来自资源文件的函数,而不是来自页面的函数。

您可以改为点击按钮。

await page.click('#ctl00_siteContent_widgetLayout_rptWidgets_ctl03_widgetContainer_ctl00_pgrTable_pagingLinksRepeater_ctl01_pageSelector');

【讨论】:

  • 太棒了!非常感谢您,也感谢您的扩展解释。它有效:)
【解决方案2】:

您可以在页面中定义之前调用该函数。尝试等待它被定义:

await page.waitForFunction(() => typeof __doPostBack !== 'undefined');
await page.evaluate(() => {
  __doPostBack('ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector','');
});

【讨论】:

  • 感谢@vsemozhetbyt 的建议。虽然我仍然收到评估错误...
【解决方案3】:

在我尝试对网站做同样的事情后看到这篇文章 https://members.acacamps.org/rentals

我尝试在底部导航器的“下一步”按钮上使用page.click,但出现Node not found or not an HTML element 错误。

不知道为什么 Puppeteer 不接受它,但可以想象它与 doPostBack 有关。

解决方案是使用 document.querySelector:

page.evaluate(()=&gt;document.querySelector('linkid').click()) 工作

希望这也可以帮助遇到此问题的任何人。我认为我们需要在这里使用querySelector,因为这种情况不像OP的问题那样有两个单独的doPostBack调用?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2020-02-24
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多