根据一列或多列查找或更改同一表行上的项目

时间:2015-08-10 16:08:17

标签: html selenium xpath selenium-webdriver

我很长时间都在努力,所以希望这会对某人有所帮助。

问题在于:

  • 我需要通过匹配一个或多个特定单元格值找到一行
  • 然后更改同一行中一个或多个单元格的值。
  • 使问题更加复杂的是,这些单元格中的值可能会被多个不同数量的DIV(以及可能的其他HTML标记)嵌套。

下面是一些人为的HTML,但希望说明一点:

<table>
    <th>Select</th>
    <th>First Name</th>
    <th>Middle Name</th>
    <th>Family Name</th>
    <th>Comment</th>
    <tbody>
        <tr>
            <td><input type="checkbox" /></td>
            <td><div><div><span>John</span></div></div></td>
            <td></td>
            <td><span>Smith</span></td>
            <td><span>Nice guy.</span></td>
        </tr>
        <tr>
            <td><input type="checkbox" /></td>
            <td><div><div><div><div><span>John</span></div></div></div></div></td>
            <td></td>
            <td><span>Doe</span></td>
            <td><span>Jolly decent cricketer.</span></td>
        </tr>
        <tr>
            <td><input type="checkbox" /></td>
            <td><div><div><div><div><span>Jane</span></div></div></div></div></td>
            <td></td>
            <td><span>Doe</span></td>
            <td><span>Great swimmmer.</span></td>
        </tr>
        <tr>
            <td><input type="checkbox" /></td>
            <td><span>Jack</span></td>
            <td></td>
            <td><span>Sprat</span></td>
            <td><span>Spiffing golfer.</span></td>
        </tr>
    </tbody>
</table>

问题是,是否有一种或多或少的通用方法来获取John Doe的复选框?

3 个答案:

答案 0 :(得分:2)

请尝试以下方法: -

//tbody/tr/td[text()='John']/following-sibling::td[text()='Doe']/preceding-sibling::td[1]/input[@type='checkbox']

在这里,我们试图找到&#39;&#39;标记 John 及其后续兄弟,即&#39; td&#39;标记使其具有文本 Doe 。一旦完成,我们就会尝试找到先前的兄弟姐妹,这是为了复选框。 这是更多的robost,意味着它没有考虑标记中的名字和姓氏的顺序。

答案 1 :(得分:1)

首先,请注意First Name列下不同级别的DIV。这使得找到前面的兄弟姐妹&#39;或者&#39;跟随兄弟姐妹&#39; TD几乎不可能。

诀窍是使用&#39; ancestor&#39; 导航到行TR,然后从该有利位置索引相应的单元格,并且您可以为多个执行此操作匹配。

E.g。在上面的示例中有两个Johns,因此要获得正确的复选框,您需要匹配名字和姓氏(John Doe)。这是执行此操作的xpath:

//table/tbody/tr/td[2]//span[text()='John']/ancestor::tr/td[4]/span[text()='Doe']/ancestor::tr/td[1]/input[@type='checkbox']

当然,上面的内容现在开启了锚定在这一行并对相邻行及其单元格执行查找或操作的可能性。

希望这能帮助别人,就像它帮助了我一样!

答案 2 :(得分:1)

没有必要经常上下树。

找到tr元素,检查span子项内任何位置的td元素文本:

//tr[td[2]//span = 'John' and td[4]//span = 'Doe']/input[@type = 'checkbox']