【问题标题】:How to click the nearest link如何点击最近的链接
【发布时间】:2013-08-07 20:50:51
【问题描述】:

假设我们有一张人桌。每一行都有一张图片、一个名字、一个城市和一些社交按钮,比如 PM、加为好友、关注。

如何“加为好友”某个人? 有 10 个人,有 10 个“添加为朋友”按钮,我有一个名字 - 比如说 George Busch。

我不知道他的个人资料将在这 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>

编辑:这是我现实生活中的例子。我无法正确连接 xpaths

这些是用户的可点击名称 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

【问题讨论】:

  • 好吧,我说的是一般情况,但是明天上班我会尝试模拟这种情况并显示一些代码!

标签: java xpath selenium webdriver selenium-webdriver


【解决方案1】:

您可以创建一个 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 单元格。现在,我假设您确定该人的姓名不会出现在屏幕的 html 中的其他任何地方:

//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']

火路

我真的建议在 firefox 中使用 Firepath - 它是检查 xpath 是否正常工作的好工具。我用它来验证这个答案中的示例 xpaths。

【讨论】:

  • 这是一个了不起的解释!!!!关于 firepath 唯一的事情是它只给了我 xpath 的一个变体,所以我使用 selenium ide,然后单击我想要的元素,然后转到编辑器并从下拉菜单中,我得到相同的不同变体xpath,所以我使用我想要的,这是一个示例: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]
  • 我们可以使用两个正斜杠来代替使用再次指定位置的点 // 这也会否定 html 结构中的任何更改。
  • 我已经编辑了我的答案,提供了我的真实示例。你能告诉我如何连接 xpath 吗?
  • xpath 是 //tr[td[text() = 'Abraham Linton']]/descendant::td/button[text() = 'Add asfriend']
  • @JennyKowalski 恐怕您永远不能相信任何工具建议的 xpath;他们总是太脆弱 - 例如。他们会假设您正在寻找第三行中的单元格,类似的东西。你真的必须从头开始自己构建你的 xpath。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    如果是,那么在下一个元素上,做一个element.findElement("") 选择器,它会返回链接,然后点击它。

    【讨论】:

    • 明天试试并分享结果
    • 我是否为用户名或“添加为朋友”按钮或表格执行 findElements()? @MrTi
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2020-04-28
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多