如何在 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 调用?
我正在尝试抓取需要通过 __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 调用?