试图抓取一个网站,这是通用的HTML代码
<select id="xxx" multiple name="zzz">
<option value="123">xaxaxa</option>
<option value="124">zazaza</option>
<option value="125">ajajaj</option>
<option value="126">azzzsa</option>
</select>
它没有被表单包含,所以我尝试使用casperjs提供的fill()函数但是没有用。
对于单个条目,我通常会使用casper.click()并且这样可以工作,但即使使用循环也不适用于多个条目
此外,我试图抓住的网站也说是“转移”#34;选择多个元素,但也可以通过拖动和选择来完成。
我需要选择多个值
答案 0 :(得分:3)
通过将每个选项元素的selected
属性设置为true
,可以轻松完成此操作。
casper.selectOptionsByValues = function(selectCssSelector, values){
this.evaluate(function(selector, values){
[].forEach.call(document.querySelector(selector).options, function(opt){
if (values.indexOf(opt.value) !== -1) {
opt.selected = true;
}
});
}, selectCssSelector, values);
};
值必须是字符串。您可以像这样使用它:
casper.selectOptionsByValues("#xxx", [ "124", "125" ]);
通过文本选择时,可以实现类似的功能:
casper.selectOptionsByTexts = function(selectCssSelector, texts){
texts = texts.map(function(t){ return t.trim() });
this.evaluate(function(selector, texts){
[].forEach.call(document.querySelector(selector).options, function(opt){
if (texts.indexOf(opt.text.trim()) !== -1) {
opt.selected = true;
}
});
}, selectCssSelector, texts);
};
并像这样使用它:
casper.selectOptionsByTexts ("#xxx", [ "zazaza", "ajajaj" ]);
可以直接为PhantomJS做同样的事情:
function selectOptionsByValues(page, selectCssSelector, values){
page.evaluate(function(selector, values){
[].forEach.call(document.querySelector(selector).options, function(opt){
if (values.indexOf(opt.value) !== -1) {
opt.selected = true;
}
});
}, selectCssSelector, values);
};
并像这样使用它:
selectOptionsByValues(page, "#xxx", [ "124", "125" ]);
如果页面上的其他元素取决于
,则可能需要触发更改事件this.evaluate(function(selector, values){
[].forEach.call(...);
var evt = document.createEvent("UIEvents"); // or "HTMLEvents"
evt.initUIEvent("change", true, true);
document.querySelector(selector).dispatchEvent(evt);
}, selectCssSelector, values);
更改事件触发器来自here。