我已经查看了类似问题的答案,看起来我的代码应该可以工作,但我得到了#34;无法点击元素"代码调用时出现错误,单击Web元素。
以下是html标记段
<div class="x-tree-node-item">
<a title="Manage Users" class="sidenavmenu_unselected" id="m-22" onclick="toggleMenu('22', '');" href="#">
<img title="" align="bottom" id="mi-22" alt="" src="ca/images/arrow.png" border="0">Manage Users
</a>
<div style="margin-left: 1em;">
<ul class="submenu-show" id="mp-22" style="height: auto; display: none;">
<li>
...
</li>
</ul>
</div>
找到链接的Java代码是:
By xpath=By.xpath("//a[contains(@title,'Manage Users')]/img");
WebElement manageUsers = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(xpath));
manageUsers.click();
它找到了元素,但是我收到错误: org.openqa.selenium.ElementNotInteractableException:无法点击元素
id是动态生成的,因此我们无法通过id找到并且图像源被多个链接使用。 谢谢你的帮助。
*更新* 在JeffC和Xwris的帮助下解决了这个问题。 JeffC的最后评论显示,找到了多个节点。所以,我添加了以下代码:
List<WebElement> manageUserImages=driver.findElements(xpath);
for (WebElement manageUserImage:manageUserImages) {
if (manageUserImage.isDisplayed()) {
manageUserImage.click();
}
}
由于&#34;管理用户&#34;一次只显示元素。作为标题,这将找到正确的元素并提供所需的结果。
@JeffC,如果您可以在评论中发布答案,我们可以将答案标记为正确答案。 再次感谢所有帮助过的人。
答案 0 :(得分:1)
看起来你的xpath是错误的。 就个人而言,我会从div开始,并深入到实际的&lt; a&gt;标签
在某些情况下,您的网络元素位于&lt; li>标签,我会更进一步向上树并选择一个未隐藏的div。
即你指示它搜索特定的&lt; div&gt;
谁告诉你你只能通过id选择?你可以用任何东西! :)
这应该有用。
//div[@class='x-tree-node-item']//a[@title='Manage Users']
这也应该有用。正确使用'包含'如下:
//div[@class='x-tree-node-item']//a[text()[contains(.,'Manage Users')]]
希望这有帮助!
PS。请注意 text contains 区分大小写并且将匹配部分文本。 所以,如果你搜索:
//a[text()[contains(.,'age User')]]
它仍将是一场成功的比赛!
OP的评论后更新:
您实际上并不需要xpath帮助程序。您只需在浏览器中点击F12,然后按CTRL + f即可打开底部的搜索字段。请参阅我的示例,了解如何使用部分文本匹配(“图像”)找到问题的标题。
还要注意xpath旁边的1个1(意味着我们的元素是唯一的)。尝试为你的情况做同样的事情。我怀疑你需要爬到树上,然后从早些时候开始。 div>所以你可以找到其余部分。
答案 1 :(得分:-1)
取消定位器的“/ img”部分。您想要单击锚点(a)而不是图像本身。
//a[@id='m-22']
或者,定位器可以是:{{1}}