2015-04-02 51 views
0

我正在進行UI端對端測試,並且在測試開始之前,我們想要構建測試所需的數據。爲此,我們使用CasperJS和waitForResource()函數。Casperjs waitForResource

我們希望等到數據庫中創建資源。 像等待HTTP GET響應狀態從404切換到200(或201)。 這是一個API REST。

代碼:

casper.waitForResource(urls.rootBE + 'ratecards/default?api_key=' + user.apiKey + '&company=' + organization.id, function(resource) { 
    utils.dump(resource); 
}); 

這是行不通的。你有一個想法如何做到這一點?

+0

[CasperJS waitForResource:如何獲取我已經等待的資源](http://stackoverflow.com/questions/24559234/casperjs-waitforresource-how-to-get-the-resource-ive-等待) – 2015-04-03 08:59:08

+0

我正在與讓 - 大衛合作。根據我們所瞭解的內容,waitForResource將等待,直到當前Phantom實例可訪問給定資源,然後執行上一個導航步驟。我們試圖實現一些不同的東西:我們想循環訪問一個http,直到它返回200而不是404。我們很難用CasperJs來處理它,因爲它的異步特性。我們應該怎麼做? – Spiff 2015-04-03 15:21:16

回答

1

你能告訴我你的代碼實際上調用API嗎?

waitForResource實際上只是等待頁面本身或casperjs手動調用的資源。這可以實施某種形式的循環中,你將調用API每5秒和斷言,API將響應的200或201

編輯:

首先你需要知道多少時間你應該等待資源在你的數據庫中。以你計算的最大時間爲準。然後編寫函數,這將迭代API調用像這樣。

var condition = false; 
function loop(index,iteration){ 
if(condition) { 
    return; 
} 
else if(index >= iteration) { 
    casper.test.fail('Record not found'); 
    return; 
} 
casper.then(function(){ 
      this.thenOpen('http://www.webpage.com/api/record/543',function(response){ 
     if(response.status==200) { 
      condition = true; 
      this.test.pass("Record found"); 
     } 
     this.echo(response.status); 
    }) 
}) 
.then(function(){ 
    loop.call(this,index+1,iteration) 
}) 
} 

casper.test.begin('Test for record',1,function suite(test){ 
casper.start() 
loop.call(this, 0, 20); 
casper.run(function(){ 
    test.done(); 
}) 
}) 

如果您需要利用高流量的呼叫,請使用setTimeout。

+0

感謝您的解釋,我們發現我們需要的不是waitForResource,因爲我們不會在頁面中加載資源。我們正在尋找一種方法來斷言在數據庫中創建了一個資源。如果你知道如何做,讓我們知道。 – 2015-04-23 12:22:38

+0

我在答案中解釋的方式是我做到的唯一方式。我將用更多信息編輯我的答案。 – 2015-04-23 14:44:13

+0

@ Jean-DavidYAPO看到更新後的答案,我爲你寫了一個簡單的腳本 – 2015-04-23 15:26:14

0

你的意思是你想得到一個jsonp或ajax響應?現在不容易。

如果沒有等待在casperjs中打開頁面,同時當前步驟是最後一步,casperjs將退出,因此必須執行一個等待步驟,然後執行打開的頁面步驟以檢查資源是否已加載。

無論何時,您無法從json或ajax請求獲取響應正文,只能響應元數據。

您可以掛鉤AJAX或JSONP請求的客戶端,並與casper.evaluate接收響應體(),或者如果你的要求寧靜的僅僅是一個「GET」方法,你可以使用casperjs clientutils模塊sendAJAX()方法detail

而這link可能會給你一個很大的幫助。

0

考慮的東西無論使用waitForSelector()有效頁面上有別人不這樣做,或者不是獲取頁面狀態代碼,並適當整理,就像這樣:

casper.on('resource.received', function(resource) { 
    statuscode = resource.status; 

}); 

if (statuscode < 404) { 
    // Thing to do on valid pages 
} 

與waitForSelector()的值將是您可以很容易地設置超時時間,以及在超時時間內指定隱式操作。

一個潛在的缺點是,一些網站/ API有一個重定向的地方,破碎的URL被重定向到一個非404頁面,這將不會在第二個實例中被拾取。