2013-10-25 94 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> 

我可以點擊與幻影/卡斯帕的鏈接,但它似乎並不奏效。我盤算了一下,要求必須在按鈕點擊發送,所有的標題,但我不能figore如何接收答案。幫幫我?

我卡斯帕代碼,工作起來的地步,我應該得到的結果頁面:https://gist.github.com/xShirase/7156131

我也試圖評估js函數,這在鉻控制檯工作,但仍然沒有給我結果在幻象......

最後一次嘗試日期:我打開我的網頁第一時間,拿到餅乾和隱藏的輸入值,然後嘗試後要求自己。仍然在捕獲相同的輸出,所以我知道我的請求是好的,但爲什麼我沒有得到正確的結果?

CODE:

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

相關問題