当我尝试运行以下代码时出现此错误:
失败:元素不可见
以下是我想要找到的元素的html代码:
<a class="dropdown-toggle ng-binding ng-scope" aria-expanded="false"
role="button" href="/" data-toggle="dropdown" ng-if="tab.subtabs">
Content
<span class="caret"></span></a>
<ul class="dropdown-menu ng-scope" role="menu" ng-if="tab.subtabs">
<li class="ng-scope" ng-repeat="test in tab.subtabs">
<a class="ng-binding" target="_self" href="/custom/ui">Custom</a>
</li>
<li class="ng-scope" ng-repeat="test in tab.subtabs">
<a class="ng-binding" target="_self" href="/patch/ui">Patch</a></li>
<li class="ng-scope" ng-repeat="test in tab.subtabs">
<a class="ng-binding" target="_self" href="/swd/ui">Software</a>
我想点击标签中的元素:
<a class="ng-binding" target="_self" href="/custom/ui">Custom</a>
<a class="ng-binding" target="_self" href="/patch/ui">Patch</a>
<a class="ng-binding" target="_self" href="/swd/ui">Software</a>
我已尝试在protractor
中使用以下代码,但它无效:
it("should click on Content and then custom", function(){
element(by.xpath('/html/body/bf-header/div/nav/div/div/div[2]/ul[1]
/li[2]/a')).element(by.xpath('/html/body/bf-header/div/nav/div/div
/div[2]/ul[1]/li[3]/ul/li[1]')).click();
答案 0 :(得分:2)
element(by.xpath('/html/body/bf-header/div/nav/div/div/div[2]/ul[1]
/li[2]/a')).element(by.xpath('/html/body/bf-header/div/nav/div/div
/div[2]/ul[1]/li[3]/ul/li[1]')).click();
好吧,现在您可以看到为什么Protractor Style Guide建议不要使用XPath定位技术:
永远不要使用xpath
为什么?
- 它是所有
中最慢和最脆弱的定位策略- 标记是 很容易变化,因此xpath定位器需要一个 很多维护
- xpath表达式不可读且很难 调试
并非总是如此,如果你选择XPath,你所做的表达式必须至少真的简单易读。要修复的第一件事是,如果你要继续使用XPath,那就不是制作绝对的XPath表达式 - 你不必从html
元素开始,并检查从树下到目标的每一个元素元件。
在这种情况下,简单&#34;通过链接文本&#34;或者&#34;通过部分链接文本&#34;定位器应该完美地工作:
element(by.linkText("Custom")).click();
请注意,可能会抛出Failed: element not visible
错误,因为在尝试单击子菜单之前,请不要单击菜单将其打开(假设这些是您需要单击的子菜单链接)。
您可能还需要等待元素可点击:
var EC = protractor.ExpectedConditions;
var custom = element(by.linkText("Custom"));
browser.wait(Ec.elementToBeClickable(custom), 5000);
custom.click();
希望有所帮助。