我爲我的測試目的寫了一些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();
});
})
嗨馬里奧,你能提供有關casperjs使用版本的信息,並且你的配置對於不同的頁面是否完全相同?就像在一個頁面中使用phantomjs併爲另一個頁面使用slimerjs一樣?我有沒有理解,即使你已經用屏幕截圖證明元素在那裏,你總是得到測試的失敗/超時?在這種情況下。checkButton正在運行? – solick
我還沒有遇到這類問題。使用':nth-of-type()'和':nth-child()'選擇器時有一個PhantomJS錯誤,但是看起來,你沒有使用它們。請註冊到'resource.error','page.error','remote.message'和'casper.page.onResourceTimeout'事件([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf)) 。也許有錯誤。如果沒有,也許你可以提供一個完整的腳本來解決這個問題。 –
我只使用phantomJS v1.9.8和casperJS v1.1.0-beta3,所以沒有slimerJS ... 我有一些錯誤,因爲我猜TLS沒有加載的資源。整個代碼非常龐大,因爲我正在測試用knockoutJS編寫的整個平臺。有沒有知道的問題?我已經搜索了很長時間找不到任何...因爲這是很大一部分代碼,我會一次調查它1個函數,並會寫回結果。 –