【问题标题】:Handling Drop Down using Protractor使用量角器处理下拉
【发布时间】:2017-10-13 16:40:51
【问题描述】:

我在自动化过程中处理琐碎场景时遇到问题。我需要使用量角器选择特定选项。我正在传递我想要选择的选项的索引,然后单击它来选择它。但是,我的 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 file 中。我在我的页面文件中调用它

 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 sn-p -

PS- 该网页正在使用 Angular2。

【问题讨论】:

  • 如果您使用element.all(by.tagName('option')).get(2).click();点击选项,错误会改变吗?
  • 我已经尝试过了,但是我得到一个索引越界异常。我通过标记名获取元素的代码似乎不起作用-因为错误表明有 0 个元素与此定位器匹配。

标签: javascript protractor angularjs-e2e


【解决方案1】:

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

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

也许你可以把它改成这样:

// 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();

希望对你有帮助

【讨论】:

  • 感谢您的建议。我尝试这样做,但我的代码在最后两行失败了。我无法使用索引或元素选择器方法选择选项 - 它给了我一个元素不可见异常。我实现这一点的方法是在最后一步模拟按键事件(Keys.DOWN)。
  • @Deadpool,tnx 的回复以及对您有用的解决方案
【解决方案2】:

解决方案 01

根据下拉值属性详细信息选择
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

根据下拉可见文本详细信息选择
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);
        });
    }

【讨论】:

  • 如果您要解释解决方案之间的区别,而不是只提供两个外观相似的代码块而没有注释,这对读者会更有帮助。
  • 解决方案 01:第 4 行 "return elem.getAttribute("value").then(function(value) {" ||||| 解决方案 02:第 4 行 "return elem.getText().然后(函数(文本){“
  • 我可以看出区别,但我认为人们也会对原因感兴趣。
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多