Selenium - 根据另一个元素

时间:2017-11-01 11:55:27

标签: java html css selenium xpath

我使用Selenium和Java,我需要为表编写一个选择器,我需要找到确切的列并右键单击它。问题是使用l​​stype查找列很简单,因为它们都有不同的值,但是不能右键单击它。因此,我需要点击它下方的框。

这大致与表格类似: Table

这大概就是html的样子:

<div class="head">
    <table>
        <tbody>
            <tr>
                <td class="game" lstype="124"></td>
                <td class="game" lstype="245"></td>
                <td class="game" lstype="873"></td>
            </tr>
        </tbody>
    </table>
</div>
<div class="body">
    <table id="extractBody">
        <tbody>
            <tr>
                <td class="game"></td>
                <td class="game"></td>
                <td class="game"></td>
            </tr>
        </tbody>
    </table>
</div>

第一部分中的每个td都指向标题框(绿色),第二部分中的每个td都是我可以实际点击的元素。

我不知道如何根据标题框中的lstype获取以下框。 我发布它只有3列,但实际上还有更多。与行相同。

我将不胜感激任何帮助。我想它应该用xpaths完成,但我尝试过的任何东西都没有用。

谢谢!

3 个答案:

答案 0 :(得分:2)

所以我假设您可以先使用一些xpath选择行。由于您没有显示有关行的任何信息,我认为它已整理出来。然后在行对象上我将使用下面的XPath

.//table[@id='extractBody']//tr/td[count(//td[@lstype='124']/preceding-sibling::td) + 1]

这种方式的工作方式是xpath

count(//td[@lstype='124']/preceding-sibling::td) + 1

当前节点之前的TD元素计数,因此如果您的节点是第二个节点,则给出1,然后我们将其添加1以获取我们的列号。然后我们使用

.//table[@id='extractBody']//tr/td[desiredcount]

要获取该索引上的元素,然后您可以单击它

答案 1 :(得分:0)

你有两种方法:1使用这个插件mozzila plugin,它会记录所有动作,点击和事件,然后,当你完成后,你可以选择以你想要的方式导出它,例如在java类上。

另一种方法是简单地在body元素的每个复选框上放置一些唯一标识符,调用它并且可以完成,通过使用xpath很复杂但是你发现其他2个选项失败,你必须应用xpath。

答案 2 :(得分:0)

我想说最简单的方法是用类游戏找到所有的td元素

List<WebElement> foo = webDriver.findElements(By.cssSelector("td.game");

然后遍历元素直到找到所需的元素,并将该索引添加到整个列表的一半大小,然后单击该元素

int count =0;
for(WebElement ele: foo){
if (ele.getAttribute("lstype").equals({searchTerm}) {
  foo.get(count+(foo.size()/2)).click()
}
count++
}

这显然假设两个表中都有相同数量的元素