CasperJS / Javascript选择多个选项

时间:2015-06-22 17:46:57

标签: javascript phantomjs html-select casperjs

试图抓取一个网站,这是通用的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;选择多个元素,但也可以通过拖动和选择来完成。

我需要选择多个值

1 个答案:

答案 0 :(得分:3)

通过将每个选项元素的selected属性设置为true,可以轻松完成此操作。

CasperJS by values

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" ]);

CasperJS by text

通过文本选择时,可以实现类似的功能:

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 by values

可以直接为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