Javascript CasperJS无法设置选择列表值

Javascript CasperJS无法设置选择列表值,javascript,phantomjs,html-select,casperjs,Javascript,Phantomjs,Html Select,Casperjs,我有一个选择列表,如下所示: <select id="ListingType" name="Criteria/ListingTypeID" onchange="Search.toggleListingType(this);"> <option selected="selected" value="1">RH1</option> <option value="2">BC4</option> <option v

我有一个选择列表,如下所示:

<select id="ListingType" name="Criteria/ListingTypeID" onchange="Search.toggleListingType(this);">
    <option selected="selected" value="1">RH1</option>
    <option value="2">BC4</option>
    <option value="3">RR3</option>
    <option value="4">RH2</option>
    <option value="5">RE0</option>
</select>
这似乎有效(不会抛出错误),但不会更改值

二,

这将抛出错误消息:`CasperError:填写表单时遇到错误:没有与css选择器匹配的字段“在表单“”中选择[name=“Criteria/ListingTypeID”]”

我的选择器怎么了

三,

这似乎也可行(没有错误),但值仍然保持不变

为了完整起见,我尝试在每个变体之后发送“change”事件。我还会在每个元素之后转储所选元素的属性,并且它从不显示正在设置的值

请注意,该选择器所在的页面上有大量JS代码,并且该元素没有封装在元素中

我肯定我犯了一些非常愚蠢的错误,但在过去几天对这段代码进行黑客攻击之后,我没有取得任何进展。这样做的有效方法是什么?

您可以使用slimerJS(它打开firefox)轻松检查值的变化

    this.fillSelectors('form#id_form', {
        'select[name="Criteria/ListingTypeID"]' :  "3"
        }, false);
    this.wait(6000,function(){  
        this.echo("i saw my new value");
    });     
如果您想用文本而不是值来填充选项(我觉得更容易):使用以下函数:

casper.fillSelectOptionByText = function (selectSelector,text){
    this.evaluate(function(sel,setByText) {
        $(sel + " > option").each(function() {
            if($(this).text() === setByText) {
                $(this).attr('selected', 'selected');            
            }                        
        });
    },selectSelector,text);
};
在你的测试中:

this.fillSelectOptionByText("select[name='year of birth']","1991");

当然,页面必须有jquery,或者您将其注入。

fillSelectors
接受一个识别表单元素的选择器,而不是字段本身……因此,
fillSelectors
似乎永远不会在没有父表单元素的元素上工作。啊。谢谢。这看起来是答案
    this.fillSelectors('form#id_form', {
        'select[name="Criteria/ListingTypeID"]' :  "3"
        }, false);
    this.wait(6000,function(){  
        this.echo("i saw my new value");
    });     
casper.fillSelectOptionByText = function (selectSelector,text){
    this.evaluate(function(sel,setByText) {
        $(sel + " > option").each(function() {
            if($(this).text() === setByText) {
                $(this).attr('selected', 'selected');            
            }                        
        });
    },selectSelector,text);
};
this.fillSelectOptionByText("select[name='year of birth']","1991");