如何在puppeteer中执行__doPostBack函数?

时间:2019-04-16 15:07:06

标签: javascript node.js web-scraping puppeteer

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

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

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

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'   

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

3 个答案:

答案 0 :(得分: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)
};

当它们使用window扩展ControlBase时,您获得的__doPostBack函数是资源文件中的一个,而不是页面中的一个。

您可以单击按钮。

await page.click('#ctl00_siteContent_widgetLayout_rptWidgets_ctl03_widgetContainer_ctl00_pgrTable_pagingLinksRepeater_ctl01_pageSelector');

答案 1 :(得分:0)

您可以在页面中定义函数之前先对其进行调用。尝试等待其定义:

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

答案 2 :(得分:0)

在我尝试对网站做同样的事情后看到这篇文章 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 调用?