这是我的问题:我在特定情况下尝试设置选择下拉列表的选项。
我通常使用this.mouse.up() + this.mouse.down()
,但在这种情况下我不能这样做,因为这种行为在使用webkit的网站上不起作用(您可以将这两者与谷歌浏览器和Firefox进行比较)。
这里的网址为:I want to set the field 'ANNEE' to a year, 2008 in my example
我的代码:(我的函数更改了HTML并启动了change()事件)
//custom function
casper.fillSelect = function(selectSelector, optionText){
this.evaluate(function(sel,setByText) {
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents")
,x = document.querySelectorAll(sel + ' > option')
,l = x.length
;
evt.initEvent("change", false, true);
for (i=0; i<l; i++){
if(x[i].textContent.indexOf(setByText) !== -1){
console.log(x[i]);
console.log(x[i].getAttribute('value'));
x[i].setAttribute('selected', true);
x[i].parentNode.dispatchEvent(evt);
}
}
}
else {console.log("error with fillSelect");}
},selectSelector, optionText);
};
//event
casper.test.on('fail', function(failure) {
casper.capture('fail.png');
});
/*************************************** Tests *****************************************************/
casper.test.begin('\n********* Compare : ***********', function (test) {
"use strict";
casper.start()
.thenOpen("http://www.linternaute.com/voyage/climat/paris/ville-75056",function(){
casper.fillSelect('fieldset.fcNeutre > div.odSelect:nth-of-type(2) > select', '2008');
})
.waitForUrl(/2008/, function(){
this.capture('fail2.png');
this.test.assertSelectorHasText("h2", "maximales");
this.test.assertSelectorHasText("h2", "minimales");
this.test.assertSelectorHasText("h2", "Paris");
this.test.assertSelectorHasText("h2", "Le soleil");
this.test.assertSelectorHasText("h2", "La pluie");
this.test.assertExists("tspan");
this.test.assertExists("div.marB20");
this.test.assertNotEquals(this.fetchText("div.marB20 > table > thead > tr > th"), "", "Table first data not empty");
})
.run(function() {
this.test.comment('--- Done ---\n');
test.done();
});
});
相当于我的casper自定义函数,您可以在浏览器中执行它:
var fillSelect = function(sel,setByText) {
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents")
,x = document.querySelectorAll(sel + ' > option')
,l = x.length
;
evt.initEvent("change", false, true);
for (i=0; i<l; i++){
if(x[i].textContent.indexOf(setByText) !== -1){
//console.log(x[i]);
//console.log(x[i].getAttribute('value'));
x[i].setAttribute('selected', true);
x[i].parentNode.dispatchEvent(evt);
}
}
}
else {console.log("error with fillSelect");}
};
fillSelect('fieldset.fcNeutre > div.odSelect:nth-of-type(2) > select', '2008');
所以它适用于FF,谷歌浏览器,slimerJS,但不适用于PhantomJS ...请帮助,如果你有另一个想法只选择这个&#39; ANNEE&#39;田野,有了casper + phantom,我带!
这可能是浏览器兼容性的问题吗?
这很奇怪,因为在同一个网站上,有时它与其他选择相同,与此相同...
答案 0 :(得分:3)
所以我的最终解决方案(感谢sudipto)
casper.fillSelect = function(selectSelector, optionText){
this.evaluate(function(sel, val) {
jQuery(sel).find("option:contains('" + val + "')").attr('selected', true).change();
}, selectSelector, optionText);
};
casper.fillSelect('fieldset.fcNeutre > div.odSelect:nth-of-type(2) > select', '2008');
答案 1 :(得分:2)
由于页面中已经有jQuery,我编写了这段代码,捕获以及currentUrl显示了发生的变化。 Jquery能够正确地引发事件。我猜。
我希望你能从中提取必要的代码:
casper.on("load.finished", function (status) {
if (status !== "success") {
console.log('Failed to load page.');
}
else {
var thisurl = casper.getCurrentUrl();
window.count = (window.count || 0)+1;
casper.capture('loaded'+window.count+'.png');
if (window.count ==1) {
casper.evaluate(function(sel, val){
jQuery(sel).find("option:contains('"+val+"')").attr('selected', true);
jQuery(sel).change();
}, 'fieldset.fcNeutre > div.odSelect:nth-of-type(2) > select', 2008);
}
console.log('Page loaded.' + thisurl);
//casper.wait(2000, function(){
}
});
祝你好运。