在我们的项目中,自动化团队将在元素中包含自定义属性“ 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”)'
需要帮助来解决此问题。
答案 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”是否存在。如果存在,请验证该值,如果该值是期望值,则返回该元素。