2013-10-25 4 views
3

Я пытаюсь очистить сайт в aspx, который имеет кнопку js dopostBack. Одна из кнопок отвечает печатаемым представлением моей страницы, другая - кликом. CSV-файл.dopostback в PhantomJS/CasperJS

Я видел вопрос здесь, который описывает проблему загрузки CSV, но не отвечает на него: PhantomJS download using a javascript link

Так я сосредоточусь на том, чтобы получить представление печати в phantomJs, как это кажется проще (он показывает в браузере окно, там должен быть способ)

код кнопки:

<a id="ctl00_ctl00_ctl00_MainContentPlaceHolder_PrintResultsLinkButton" 
    title="Print Results" class="btn-blue"  
    href="javascript: 
    __doPostBack('ctl00$ctl00$ctl00$MainContentPlaceHolder$PrintResultsLinkButton','') 
"> 
    <span>Print Results</span> 
</a> 

я могу нажать на ссылку с Phantom/Casper, но не кажется, что это будет работать. Я решил, что запрос должен быть отправлен при нажатии кнопки со всеми заголовками, но я не могу понять, как получить ответ. Помогите?

мой код Casper, работая до того момента, когда я должен получить страницу результатов: https://gist.github.com/xShirase/7156131

Я также попытался оценить функцию JS, которая работает в хромированной консоли, но все-таки не дать мне результаты в phantom ...

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

КОД:

casper.start(); 

capture = function(){ 
    var url = 'http://www.cms.gov/apps/physician-fee-schedule/search/search-criteria.aspx'; 
    casper.open(url).thenClick('a.btn',function() { 
    this.then(grabResults); 
    }); 
}; 

grabResults = function(){ 
    this.echo(this.getCurrentUrl()); 
    this.open('http://www.cms.gov/apps/physician-fee-schedule/search/search-results.aspx?Y=0&T=0&HT=2&CT=3&H1=00100&H2=11400&M=5').then(function(){ 
    this.capture('page.png'); 
    a = this.evaluate(function(){ 
     var v = $('input:hidden#__VIEWSTATE').val(); 
     var d = document.cookie; 
     return [v,d]; 
    }); 
    }); 
    this.then(grabPRResults); 

}; 


grabPRResults = function(){ 
    this.open('http://www.cms.gov/apps/physician-fee-schedule/search/search-results.aspx?Y=0&T=0&HT=2&CT=3&H1=00100&H2=11400&M=5', { 
    method: 'post', 
    headers: { 
     'Host': 'www.cms.gov', 
     'Connection': 'keep-alive', 
     'Content-Length': '103902', 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
     'Origin': 'http://www.cms.gov', 
     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36', 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Referer': 'http://www.cms.gov/apps/physician-fee-schedule/search/search-results.aspx?Y=0&T=0&HT=2&CT=3&H1=00100&H2=11400&M=5', 
     'Accept-Encoding': 'gzip,deflate,sdch', 
     'Accept-Language': 'fr,en-US;q=0.8,en;q=0.6', 
     'Cookie': a[1] 
     }, 
    data: { 
     '__EVENTTARGET':'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$PrintResultsLinkButton', 
     '__EVENTARGUMENT':'', 
     '__LASTFOCUS':'', 
     '__VIEWSTATE':a[0], 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$PFSSResultsCPEWrapper_ClientState':'false', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$YearDropDown':'2013', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$TypeOfInfoDropDown':'pi', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPCTypeDropDown':'range', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$CarrierTypeDropDown':'all', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPC1Textbox':'00100', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPC2Textbox':'11400', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPC3Textbox':'', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPC4Textbox':'', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$HCPC5Textbox':'', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$ModifierDropDown':'%', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$CarrierDropDown':'default', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$CarrierLocalityDropDown':'default', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$ResultsControl1$PFSSGridView$ctl01$ tbGotoPage':'', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$ResultsControl1$PFSSGridView$ctl01$PFSSGridViewtopddlTopPageSize':'10', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$ResultsControl1$PFSSGridView$ctl14$ tbGotoPageBottom':'', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$ResultsControl1$PFSSGridView$ctl14$PFSSGridViewbottomddlBottomPageSize':'10', 
     'ctl00$ctl00$ctl00$CMSGMainContentPlaceHolder$ToolContentPlaceHolder$PFSSContentPlaceHolder$DownloadsWidget1$DownloadsCPEWrapper_ClientState':'false' 
    } 
    }).then(function(){ 
    this.wait(25000); 
    this.then(lest); 
    }); 
}; 

lest= function(){ 
    this.capture('ppp.png'); 
}; 

casper.then(capture); 
casper.run(); 

ответ

3

Из того, что я могу сказать, ваши основные вопросы, в настоящее время уведомления, когда постбэк завершена. Я издевался над простой страницей aspx, которая имитирует длинную обратную передачу, она должна работать для вашего дела. Чтобы дождаться завершения обратного вызова, вы можете использовать стандартную функциональность casperjs, чтобы выполнить очистку. Я немного беспокоюсь о публикации инструкций по очистке правительственного сайта, надеюсь, моя тестовая страница будет достаточной, чтобы помочь вам разобраться.

CasperJS

var casper = require('casper').create({ 
    // verbose: true, 
    logLevel: "debug" 
}); 
casper.start(); 

casper.on('remote.message', function (message) { 
    this.echo(message); 
}); 


grabResults = function() { 
    this.echo(this.getCurrentUrl()); 
}; 

casper.start('http://localhost:13851/default.aspx', function() { 

    casper.thenClick('#Button1', function() { 
     // Setup a listener for the postback complete event 
     this.evaluate(function() { 
      Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() { 
       console.log("client: doPostback complete"); 
       window.onPostBackComplete = true; 
      }); 
     }); 

     // Use waitFor to wait for the postback to be finished 
     this.waitFor(function() { 
      return this.evaluate(function() { 
       return window.onPostBackComplete; 
      }); 
     }, function then() { 
      this.echo("doPostback complete"); 
      this.echo("value of test label: " + this.fetchText('#Label1')); 
     }, function timeout() { 
      this.echo("-- > timeout"); 
     }, 
     5000); 
    }); 


}); 

casper.run(function() { 
    this.echo("finished"); 
}); 

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" %> 
<!DOCTYPE html> 
<script runat="server">  
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Label1.Text = "Slow loaded text"; 
     System.Threading.Thread.Sleep(1000); // simulate a slow server 
    } 
</script> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Sample page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
     <div> 
      <asp:UpdatePanel ID="UpdatePanel1" runat="server" > 
       <ContentTemplate> 
        <asp:Label ID="Label1" runat="server" Text="Default Label"></asp:Label> 
        <br /> 
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
     </div> 
    </form> 
</body> 
</html> 

фотографии: http://forums.asp.net/t/1245557.aspx?how+to+detect+the+end+of+__doPostBack+in+Javascript

Смежные вопросы