如何点击最近的链接

时间:2013-08-07 20:50:51

标签: java xpath selenium webdriver selenium-webdriver

让我们说我们有一张人的表。在每一行中都有一张图片,一个名字,一个城市和一些社交按钮,如PM,添加为朋友,关注。

我如何“加为好友”某个人? 有10个人,有10个“添加为朋友”按钮,我有一个名字 - 让我们说乔治布施。

我不知道他的个人资料将从哪个地方取出10个页面,当页面生成时,我只想点击“添加为朋友”链接,该链接最接近George Busch。

编辑:我将使用接受答案中提供的示例代码来演示我的案例:

<table id="addfriendstable" class="colouredgrid">
    <tr id="person65894" class="resultsrow odd">
        <td>George Busch</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
    <tr id="person3244" class="resultsrow even">
        <td>Jimmy Corker</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
    <tr id="person91236" class="resultsrow odd">
        <td>Abraham Linton</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
</table>
编辑:这是我现实生活中的榜样。我无法正确连接xpath

这些是用户的可点击名称xpaths:

xpath=(//a[contains(text(),'Justin Timberlake')])[2]

//div[@id='main']/div/section/section/ul/li[2]/article/section/section/a

xpath=(//a[contains(@href, '/users/justin-timberlake')])[4]

//li[2]/article/section/section/a

这些是“添加为朋友”按钮的不同变体:

xpath=(//a[contains(text(),'Add as Friend')])[2]

//div[@id='main']/div/section/section/ul/li[2]/article/section/section/div/a

//a[contains(@href, '/users/1/friendships?friend_id=51c027d7f325db7ee7000032&origin=search')]

//li[2]/article/section/section/div/a

3 个答案:

答案 0 :(得分:2)

这对于使用网格来说是一种非常常见的情况。最好的方法是使用xpath。诀窍是获取包含名称George Busch的行,无论行在网格中的哪个位置。在行中单击按钮。将在以下网站中使用网格给出一个简单的示例。 http://demos.kendoui.com/web/grid/index.html 。网格客户数据库有很多用户。我将展示xpath,它将获得名为Margaret的人的年龄。如果你显示html可能会给出类似的东西。 xpath如下。

//tr[td[text() = 'Margaret']]/descendant::td[text()= '55']

答案 1 :(得分:2)

您可以创建一个xpath来标识包含文本'George Busch'的表格单元格,然后跟踪到包含该按钮的单元格。这简洁而有效。

究竟如何构造xpath取决于你的整体html结构,但我会向你展示一个简单的工作示例。

HTML

<table id="addfriendstable" class="colouredgrid">
    <tr id="person65894" class="resultsrow odd">
        <td>George Busch</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
    <tr id="person3244" class="resultsrow even">
        <td>Jimmy Corker</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
    <tr id="person91236" class="resultsrow odd">
        <td>Abraham Linton</td>
        <td><button class="befriend">Add as friend</button></td>
    </tr>
</table>

构建xpath

xpath的第一部分是唯一标识包含文本的td单元格。现在,我假设您确定该人的姓名不会出现在屏幕的其他任何地方:

//td[text()='George Busch']

xpath的下一部分使用双点..表示法来表示父级,因为我们希望将层次结构返回到tr表行的一级:

//td[text()='George Busch']/..

xpath的下一部分沿着层次结构向下找到按钮;现在,我假设表格的每一行只有一个按钮:

//td[text()='George Busch']/../td/button

所以整体模式集中在两个元素,人名和按钮; xpath首先找到人名,然后跟踪层次结构到公共父级,然后返回到按钮。

调整xpath

根据您的整体html结构,我的示例xpath可能需要更改。例如,屏幕可能有许多不同的表格,其中可能出现“ George Busch ”文本?在这种情况下,您需要唯一地标识表,例如使用如下的id:

//table[@id='addfriendstable']//td[text()='George Busch']/../td/button

或者表格中每行有几个按钮?如果是这样,我们需要唯一地标识我们想要的按钮,例如使用类:

//td[text()='George Busch']/../td/button[@class='befriend']

Firepath

我真的建议将Firepath用于firefox - 它是检查xpath是否正常工作的绝佳工具。我已经用它来验证这个答案中的示例xpath。

答案 2 :(得分:1)

编写一个选择器,以便findElements()将返回10个元素(每个人一个)

在每个元素上,执行element.getText(),然后测试它是否包含George Busch。

如果是,则在下一个元素上,执行将返回链接的element.findElement("")选择器,然后单击它。