首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在木偶中执行__doPostBack函数?

如何在木偶中执行__doPostBack函数?
EN

Stack Overflow用户
提问于 2019-04-16 23:07:06
回答 3查看 844关注 0票数 0

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

代码语言:javascript
复制
javascript:__doPostBack('ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector','')

这样就行了,我可以转到下一页了。然而,在将此命令传递给木偶师时,我遇到了一些困难。我尝试了以下几种方法,但都没有成功。

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

我还尝试修改aspnet表单,将__EVENTTARGET值重置为

代码语言:javascript
复制
'ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector'   

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-20 03:21:19

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

页面中的一个:

代码语言:javascript
复制
//<![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();
    }
}
//]]>

和源脚本中的另一个

代码语言:javascript
复制
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函数,而不是来自页面的函数。

您可以改为单击该按钮。

代码语言:javascript
复制
await page.click('#ctl00_siteContent_widgetLayout_rptWidgets_ctl03_widgetContainer_ctl00_pgrTable_pagingLinksRepeater_ctl01_pageSelector');
票数 1
EN

Stack Overflow用户

发布于 2019-04-17 04:04:07

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

代码语言:javascript
复制
await page.waitForFunction(() => typeof __doPostBack !== 'undefined');
await page.evaluate(() => {
  __doPostBack('ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector','');
});
票数 0
EN

Stack Overflow用户

发布于 2021-03-31 00:51:06

在我尝试用https://members.acacamps.org/rentals网站做同样的事情后,我发现了这篇文章

我试图通过底部的导航器在“下一步”按钮上使用page.click,但是我得到了一个Node not found or not an HTML element错误。

不知道为什么木偶不把它捡起来,但想像一下这和doPostBack有关。

解决方案是使用document.querySelector:

page.evaluate(()=>document.querySelector('linkid').click())成功了

希望这篇文章也能帮助那些有这个问题的人。我认为我们需要在这里使用querySelector,因为这种情况没有像OP的问题那样有两个独立的doPostBack调用?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55711331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档