我正在尝试抓取需要通过__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'
,但这似乎还不够。感谢您的任何建议。
答案 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 调用?