2015-04-22 58 views
0

我爲我的測試目的寫了一些CasperJS模塊。它們由反覆使用的各種功能組成。我注意到,相同的功能在不同的頁面上不能用於相同的功能。當我研究它時,我發現實際上原生的CasperJS函數是造成麻煩的原因。一些CasperJS功能不一致

例如:

waitUntilVisible('.buy') 

正在寫新的代碼塊不返回true時不再爲我工作的所有的時間和最近。我曾嘗試與

waitFor(function(){ 
    return this.exists('.buy'); 
} 

,仍然沒有運氣來取代它......從那以後,我試圖用評估這樣

waitFor(function(){ 
    return this.evaluate(function(){ 
     return $('.buy').length > 0; 
    }) 
} 

通常斷言爲true。在這段代碼之前和之後看截圖清楚地表明元素在那裏。

奇怪的是,這個確切的代碼片段,它檢查購買按鈕,並點擊它,如果它存在,在其他相同的頁面上工作。

下面是函數的不工作

this.checkButton = function(){ 
    casper.waitUntilVisible('.buy',function(){ 
     this.test.pass('Button visible'); 
     this.click('.buy'); 
    },function(){ 
     this.test.fail('Button not visible'); 
    }).waitUntilVisible('div.header h2', function(){ 
     this.test.pass('Button works'); 
    },function(){ 
     this.test.fail('Button does not work'); 
    }) 
} 

聽page.error和remote.message給任何東西的。

我當前的等待超時設置爲30秒。

有沒有人有任何想法可能出錯?

感謝

編輯: 所以看起來這個問題是與模塊有關。我從字面上將模塊中各種功能的代碼複製到1個程序文件中。它正常工作。該程序代碼如下:

.then(function(){ 
    var records = casper.evaluate(function(){ 
     return document.querySelectorAll('.content table tr').length; 
    }); 
    if(records > 0) this.test.pass(records +' records shown'); 
    else this.test.fail(records +' records shown'); 
}) 
.waitForSelector('#main .btn.small',function(){ 
    this.test.pass('Load more button found') 
}, function(){ 
    this.test.fail('Load more button not found') 
}) 
.then(function(){ 
    if(this.exists('#main .btn.small')) this.test.pass('Button exists'); 
    else this.test.fail('Button does not exist !?'); 
}) 
.thenClick('#main .btn.small') 
.then(function(){ 
     this.sendKeys('.listfilter-wrapper input','2487'); 
}) 
.wait(5000) 
.then(function(){ 
    var length = casper.evaluate(function(){ 
     return $('.content table tr').length; 
    }); 
    if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length); 
    else this.test.assert(false, 'Search does not work'); 
}) 

這是寫在模塊相同的代碼:

this.isLoaded = function(){ 
casper.then(function(){ 
    var records = casper.evaluate(function(){ 
     return document.querySelectorAll('.content table tr').length; 
    }); 
    if(records > 0) this.test.pass(records +' records shown'); 
    else this.test.fail(records +' records shown'); 
}); 
}, 

this.loadMore = function(){ 
casper.then(function(){ 
    if(this.exists('#main .btn.small')) { 
     this.test.pass('Load more button exists'); 
     casper.click('#main .btn.small'); 
     casper.wait(500); 
    } 
    else this.test.fail('Load more button does not exist') 
}) 
}, 

this.search = function(){ 
casper.then(function(){ 
    this.sendKeys('.listfilter-wrapper input','2487'); 
}).wait(5000); 
casper.then(function(){ 
    var length = casper.evaluate(function(){ 
     return $('.content table tr').length; 
    }); 
    if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length); 
    else this.test.assert(false, 'Search does not work'); 
}); 
} 

這是調用步驟

module.exports = function(){ 
    this.check = function(){ 
     platform.navigateTo('Actions'); 
     this.isLoaded(); 
     this.loadMore(); 
     this.search(); 
    } 
} 

的功能,這是呼叫模塊

a = require('./modules/actions'); 
var actions = new a(); 
casper.test.begin('Testing',8,function suite(test){ 
casper.start(); 

actions.check(); 

casper.run(function(){ 
    test.done(); 
}); 
}) 
+0

嗨馬里奧,你能提供有關casperjs使用版本的信息,並且你的配置對於不同的頁面是否完全相同?就像在一個頁面中使用phantomjs併爲另一個頁面使用slimerjs一樣?我有沒有理解,即使你已經用屏幕截圖證明元素在那裏,你總是得到測試的失敗/超時?在這種情況下。checkButton正在運行? – solick

+0

我還沒有遇到這類問題。使用':nth-​​of-type()'和':nth-​​child()'選擇器時有一個PhantomJS錯誤,但是看起來,你沒有使用它們。請註冊到'resource.error','page.error','remote.message'和'casper.page.onResourceTimeout'事件([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf)) 。也許有錯誤。如果沒有,也許你可以提供一個完整的腳本來解決這個問題。 –

+0

我只使用phantomJS v1.9.8和casperJS v1.1.0-beta3,所以沒有slimerJS ... 我有一些錯誤,因爲我猜TLS沒有加載的資源。整個代碼非常龐大,因爲我正在測試用knockoutJS編寫的整個平臺。有沒有知道的問題?我已經搜索了很長時間找不到任何...因爲這是很大一部分代碼,我會一次調查它1個函數,並會寫回結果。 –

回答

0

那麼在調查了更多之後,我認爲這個問題與phantomJS問題有關,它與css選擇器與第n個類型的一致性並調用casper.reload()。通過刪除reload()函數,我消除了我測試中的大多數失敗,但仍然有更多的選擇器需要替換以測試它是否與此有關。

希望有所幫助。