我是硒和HTML的新手。我想对元素“ Users”和“ Admins”一个接一个地执行单击操作。下面提到的是HTML代码,很遗憾,我无法对其进行修改。

 <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.
}
 


评论


我发现当OP明确要求XPath解决方案并且有有效的XPath答案时,可接受的答案显示了如何使用CSS定位器来做到这一点,这很有趣。

– Ardesco
19年6月3日在9:17

#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')]