使用量角器处理下拉

时间:2017-04-11 18:59:42

标签: javascript protractor angularjs-e2e

我在自动化过程中遇到处理微不足道的问题。我需要使用Protractor选择一个特定的选项。我传递了我想要选择的选项的索引,然后单击它以选择它。但是,我的click()方法错误说明click()方法在该索引上未定义。

以下是我要做的事情 - 在我的selectElements.js文件中,下拉方法定义为

const selectElement={}

selectElement.selectElementDropdown =function(element,index,milliseconds){
   console.log("Selecting element by drop down","OK");

   element.all(by.tagName('option')).then(function(options){

   options[2].click(); 
  //here index 2 is hardcoded, which can be changed to options[index]
  });

 if(typeof milliseconds!=='undefined'){
     browser.sleep(milliseconds);
  }

 }

 module.exports =selectElement;

我使用的是POM结构,因此下拉方法位于单独的.js文件中。我在我的页面文件中调用它

 const methodDropDown = require('../BasePage/selectElements.js');


 var signUpBankDetails = function(){

    this.bankName = element.all(by.css('.form-group')).get(7).element(by.xpath("//label[text()='Select Bank Name']"));
   //the selector is clicked to open the drop down

  console.log("Start of this block =========>");

  this.selectDropDownMethod = function(){
     console.log("Drop Down method start ==========>");
     this.bankName.click();
     browser.sleep(1000);
     methodDropDown.selectElementDropdown(this.bankName,0,1000);

   };

我收到的错误是 -

   Failed: Cannot read property 'click' of undefined

this.bankName.click()块工作正常,因为我可以看到单击该元素并显示下拉列表,但选择似乎是错误的。我还附上了下面的HTML代码片段 -

enter image description here

PS-该网页正在使用Angular2。

2 个答案:

答案 0 :(得分:4)

当我查看HTML时,我发现标签不包含 select 。选择位于与{em>标签位于同一级别的<div class="ui-helper-hidden-accessible">..</div>中。

当我看到您时,我看到您将标签this.bankName)作为 ElementFinder 传递给此methodDropDown.selectElementDropdown(this.bankName,0,1000);methodDropDown.selectElementDropdown()从您传递的 ElementFinder 开始搜索,这是label,而不是选择<div class="ui-helper-hidden-accessible">..</div>。< / p>

也许你可以把它变成这样的东西:

// Define ElementFinder for the bankname component
const bankNameComponent = $('p-dropdown[formcontrolename="bankname"]');
// Open the dropdown
bankNameComponent.$('label').click();
// Click on an element by index
bankNameComponent.$$('select option').get(2).click();
// Or search by text in the dropdown
bankNameComponent.element(by.cssContainingText('option', 'BNI')).click();

希望有所帮助

答案 1 :(得分:0)

解决方案01

Select based on drop-down values attribute details
public selectOptionByValue(element: ElementArrayFinder,valueToSelect: string) : void{
        let clickedIndex: number;
        element.first().$$('option').filter(function(elem, index) {
            return elem.getAttribute("value").then(function(value) {
                if (value === valueToSelect) {
                    elem.click();
                    console.log('Yes ! Found option is:' + value);
                }
                return value === valueToSelect;
            });
        }).then(function (bool) {

        }).catch(function (err) {
            console.log('Ooops ! Error... '+err.message);
        });
    }

解决方案02

Select based on drop-down visible text details
public selectOptionByText(element: ElementArrayFinder,optionToSelect: string) : void{
        let clickedIndex: number;
        element.first().$$('option').filter(function(elem, index) {
            return elem.getText().then(function(text) {
                    if (text === optionToSelect) {
                        elem.click();
                        console.log('Yes ! Found option is:' + text);
                    }
                return text === optionToSelect;
            });
        }).then(function (bool) {

        }).catch(function (err) {
            console.log('Ooops ! Error... '+err.message);
        });
    }