如何在 puppeteer 中执行 __doPostBack 函数?

How can I execute a __doPostBack function in puppeteer?

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

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

这有效,我可以移至下一页。但是,我在将此命令传递给木偶操纵者时遇到了一些困难。我尝试了以下但没有成功。

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'   

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

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

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

问题是 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');

在我尝试对网站做同样的事情后遇到了这个 post https://members.acacamps.org/rentals

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

不确定为什么 Puppeteer 不接受它,但可以想象它与 doPostBack.

有关

解决方案是使用 document.querySelector:

page.evaluate(()=>document.querySelector('linkid').click()) 工作

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