Как я могу выполнить функцию __doPostBack в кукловоде? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь очистить веб-страницу, требующую нажатия кнопки страницы с помощью функции __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','');}) 

Я также пытался изменить форму aspnet, сбросив значение __EVENTTARGET на

'ctl00$siteContent$widgetLayout$rptWidgets$ctl03$widgetContainer$ctl00$pgrTable$pagingLinksRepeater$ctl02$pageSelector'   

но, похоже, этого недостаточно. Благодарен за любые предложения.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Проблема в том, что 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');
0 голосов
/ 16 апреля 2019

Вы можете вызвать функцию до того, как она будет определена на странице. Попробуйте дождаться его определения:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...