<ul id="nav">
<li class="">
<a class="mainmenu" title="List of Users" menuid="nav_0">
<span class="title">Users</span>
<span class="arrow"/>
</a>
<ul class="sub-menu">
<li>
<a class="mainmenu" title="List of Admins" menuid="nav_0-sub_0">Admins</a>
</li>
</ul>
</li>
<li class="">
<a class="mainmenu" title="List of Contents" menuid="nav_1">
<span class="title">Contents</span>
</a>
</li>
<li class="">
<a class="mainmenu" title="Repos" menuid="nav_2">
<span class="title">Repository</span>
</a>
</li>
我已经使用过XPath,例如:
.//*[@id='nav']/li[1]/a[contains(@title, 'List of Users']
还有其他方法来获取与文本值匹配的元素吗?由于列表元素的顺序是动态的,因此元素“ Users”(
li[1]
)的当前位置以后可能会更改。#1 楼
根据给定的描述,似乎用户列表将在具有公共标题=用户列表的HTML列表项中维护。因此,您可以使用下面的代码来单击动态列表项(此处为用户)。 List<WebElement> Userlist = driver.findElements(By.cssSelector("a[title='List of Users']");
for(WebElement ulist : Userlist)
{
//Do your action, e.g. click() with each user name.
}
#2 楼
您可以尝试使用text()
创建xpath,如下所示://span[contains(text(),'Users')]
//span[contains(text(),'Contents')]
评论
它无法使用此元素来选择元素。
–爵士
2015年9月23日在7:08
Pankaj Kumar Katiyar / demouser123缺少右括号]。 // span [contains(text(),'Users')] // * [contains(text(),'Users')] // span [text()='Users'] // * [text()= 'Users'] // a [contains(text(),'Admins')] // * [contains(text(),'Admins')] // a [text()='Admins'] // * [ text()='Admins']这些都应该起作用
–罗斯科
18-09-17在19:48
#3 楼
为了避免li[1]
,只需使用此XPath。即使其中一个li
元素交换了它们在html文件中的位置,它仍然可以工作。//*[@id='nav']/li/a[contains(@title,'List of Users')]
如果页面上只有一个
<a>
元素,则可以避免使用li
部分//a[contains(@title,'List of Users')]
#4 楼
//*[@id='nav']/li[1]/a[contains(@title, 'List of Users']
您在最后一个']'处错过了')',它应如下所示:
//*[@id='nav']/li[1]/a[contains(@title, 'List of Users')]
评论
我发现当OP明确要求XPath解决方案并且有有效的XPath答案时,可接受的答案显示了如何使用CSS定位器来做到这一点,这很有趣。
– Ardesco
19年6月3日在9:17