量角器自定义定位器无法找到元素

时间:2019-06-11 11:24:14

标签: javascript selenium-webdriver protractor

在我们的项目中,自动化团队将在元素中包含自定义属性“ lid”,这是我们无法唯一标识元素的地方。

我创建了一个自定义定位器方法来使用自定义属性“ lid”检测元素。在下面:

   by.addLocator('lid', function(value, parentElement) 
    { 
    parentElement = parentElement || document; 
     var nodes = parentElement.querySelectorAll('lid'); 

     return Array.prototype.filter.call(nodes, function(node) 
     { 
         return (node.getAttribute('lid') === value); 
     }); 
   });

这是页面的html代码

 <div class="col-sm-8 cbx">
                        <p class="ng-binding"><input type="radio" ng-model="theme"
 lid="create-user-them-radio1" ng-value="1" ng-click="user.theme = -1" class="ng-
pristine ng-untouched ng-valid ng-not-empty" name="1194" value="1"> Use the default
 for this domain</p>
                        <p class="litetext ng-binding">Following options override 
the domain's default value</p>
                        <p class="ng-binding"><input type="radio" ng-model="theme"
 lid="create-user-them-radio2" ng-value="2" class="ng-pristine ng-untouched ng-
valid ng-not-empty" name="1195" value="2"> Select theme for the user</p>
 </div>

我想使用'lid'属性并找到元素,并编写上述方法以使用任何属性和值。

我从测试文件中调用该方法,如下所示:

element(by.lid("create-user-them-radio1")).click();

我得到了'使用定位器找不到元素:by.lid(“ create-user-theme-radio1”)'

需要帮助来解决此问题。

2 个答案:

答案 0 :(得分:0)

如果默认方法可以做同样的事情,为什么需要创建自定义方法

element(by.xpath('.//li[contains(@ng-if, "$select.open")]')).click();

PS:如果您将在产品模式下运行测试,则此定位器将不起作用。像ng-%blabla%这样的属性仅在开发模式下嵌入。

答案 1 :(得分:0)

我能够找到正确的解决方案,解决方案如下:

by.addLocator('lid', function(value, parentElement) {
        var nodes;

        if(parentElement)
            nodes =  parentElement.querySelectorAll();
        else
            nodes = document.querySelectorAll('body *');


        return Array.prototype.filter.call(nodes, function(node) {
            if( node.hasAttribute("lid") && node.getAttribute('lid') === value)
                return node;
        });
    });

querySelectorAll()需要将输入作为“标签”提供,如果未发送parentElement,则它将查询“ body”标签下的所有标签,否则查询parentElement中的所有元素。之后,遍历所有元素并检查属性“ lid”是否存在。如果存在,请验证该值,如果该值是期望值,则返回该元素。