【问题标题】:WebDriver Selenium: Need to select element in the table after some elementWebDriver Selenium:需要在某些元素之后选择表格中的元素
【发布时间】:2015-07-12 20:53:09
【问题描述】:

HTML 页面包含用户详细信息表。
我需要删除用户。
我可以通过用户名选择行中的第一个元素。
我需要选择该行上的“删除”按钮来删除该用户。
HTML 结构为:

<table id="tblUsersGrid" cellpadding="2">  
<thead>  
<tbody>
<tr class="aboutMeRow" data-parentid="223">  
<tr>  
<tr>  
 ...
<tr>
    <td class="cell cell_278 cell_NameCell">xoxo</td>
    <td class="optionIcon overrideFloat orgIcon cell cell_278 gridCell"></td>  
    <td class="cell cell_278 gridCell">Custom</td>  
    <td class="cell cell_278 gridCell">qaadmin</td>  
    <td class="cell cell_278 gridCell">0</td>  
    <td class="cell gridCell">  
        <div class="removeAccountIcon"></div>  
    <td class="cell gridCell">  
        <div class="editAccountIcon"></div>  
    </td>  
    <td></td>  
</tr>  

所以我可以通过

轻松选择所需的行
driver.findElement(By.xpath("//td[@class='cell_NameCell'][contains(text(),'xoxo')]"))  

但是我怎样才能到达该行的removeAccountIcon 元素呢?
我看到很多关于在表格中选择元素的问题,但没有找到解决这个问题的方法。
有没有办法通过CSS 选择器来做到这一点,而不仅仅是Xpath? (我确信有一个Xpath 解决方案)。

【问题讨论】:

  • 我知道这不是您真正想要的,但您可以找到该表,然后按行迭代并使用 findElements 获取列列表 (td)。在列表中,您可以按索引获取元素以检查用户并获取按钮(这里有类似的代码来执行此操作stackoverflow.com/a/14192252
  • 嗯,这是一个解决方案。你说的对。但我想只有一个表达式 (Xpath) 可以完成这项工作。
  • 是的,我也猜...像这样的: //td[contains(text(),'xoxo')/following-sibling::td//div[@class='removeAccountIcon ']

标签: css selenium xpath selenium-webdriver


【解决方案1】:

您可以使用以下XPath 表达式一次性完成:

//tr[td[contains(@class, 'cell_NameCell')] = 'xoxo']//div[@class='removeAccountIcon']

在这里,我们通过检查包含cell_NameCell 类(这是您的用户名单元格)的td 元素的文本来定位适当的tr 行。然后,我们在这一行中找到“删除帐户图标”。

【讨论】:

  • 我也会检查这个。谢谢!
  • 我理解您的逻辑,但您提供的 Xpath 表达式对我不起作用。我尝试对其进行编辑,但仍然无法使其正常工作。
  • 能否请您检查一下您写的表达式,以便它可以工作?我已经有了@Abhishek 提供的可行解决方案,但是如果有不止一种方法可以做到这一点,那就太好了。
  • @Eliyahu 是的,已修复。谢谢:)
  • 谢谢,不过这个表达还是不好。只需将其复制到 'driver.findElement(By.xpath("****")).click();'作为表达式而不是星号 Eclipse 编辑器检测语法错误...
【解决方案2】:

Xpath 轴preceding-sibling 将帮助您解决问题。你可以试试下面的xpath:

//td[preceding-sibling::td[contains(text(),'xoxo')]][5]/div[@class='removeAccountIcon']

让我知道它是否适合你。

【讨论】:

    【解决方案3】:

    如果您可以选择正确的行,则可以通过在该行上调用 findElement 而不是原始驱动程序来选择该行中所需的元素。但是,您建议用于查找正确行的代码似乎不起作用。 (它选择 td 而不是 tr。)

    我建议如下:

    WebElement userDataInRow = driver.findElement(By.xpath(//td[contains(text(),'xoxo')]))
    WebElement row = userDataInRow.findElement(By.xpath(".."))
    row.findElement(By.xpath("//div[@class='removeAccountIcon']"))
    

    第二行转到所选 td 元素的父元素。

    【讨论】:

    • 我有一张桌子。每行包含class="removeAccountIcon" 元素。我需要在所需行上选择此元素,其中包含我要删除的用户,而不是表中的第一个用户。
    • 这不是我要求的方式,但谢谢。这也是一种有趣的方法。
    【解决方案4】:

    我认为没有使用 css 选择器来查找父级的选项。 This 文章提供了其他替代方法来找到相同的。

    要使用 xpath 捕获“删除”按钮,我们只需要遍历表的“名称”单元格的父级,然后获取“删除链接/按钮”的“div”。

    那么你的 xpath //td[@class='cell'][contains(text(),'xoxo')] 应该更新如下:

    //td[contains(text(),'xoxo')]/../td/div[@class='removeAccountIcon']

    这将根据给定名称捕获“删除帐户图标”。

    【讨论】:

    • 我明天会检查这个。谢谢!
    • 能否请您检查一下您写的表达式,以便它可以工作?我已经有了@Abhishek 提供的可行解决方案,但是如果有不止一种方法可以做到这一点,那就太好了。
    • 我的坏...有一个语法错误..我没有验证问题中提到的 xpath。无论如何..这是获得它的方法..
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2018-08-14
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多