我目前正在使用java / selenium webdriver自动化。但是我被困在这个特定的部分,我无法使webdriver点击基于值的复选框。
driver.findElement(By.xpath( “//输入[@类= 'chkPopupCod'] /以下:: TD [含有(文本(), 'BBB')]”))点击();
当我没有使用xpath的Axes部分时它可以工作,但它只能选择第一个复选框
以下是html的片段
<tr class="even">
<td style="width: 20px;">
<input class="chkPopupCod" type="checkbox">codData=Object { id=101914, codId=101906, label="AAA", more...}
</td>
<td class="" align="left">AAA</td>
</tr>
<tr class="odd">
<td style="width: 20px;">
<input class="chkPopupCod" type="checkbox" style="background-color: rgb(255, 255, 255);">codData=Object { id=101918, codId=101907, label="BBB", more...}
</td>
<td class="" align="left" style="background-color: transparent;">BBB</td>
</tr>
<tr class="even">
<td style="width: 20px;">
<input class="chkPopupCod" type="checkbox">codData=Object { id=101922, codId=101908, label="CCC", more...}
</td>
<td class="" align="left">CCC</td>
</tr>
答案 0 :(得分:2)
你的XPath中有正确的想法。只需翻转它:
//td[contains(text(),'BBB')]/preceding::td/input[@class='chkPopupCod']
在中,获取其中包含文本的元素 first 。在之后穿过树。
答案 1 :(得分:0)
使用表时,我总是首先要确定我正在处理哪个表行。为此,我有一个方法来返回表格行,然后从那里开始寻找我想要使用的元素。
实施例: 获取父表行的方法 -
public void IWebElement GetParentTableRow(IWebElement element)
{
while (!element.TagName.ToLower().Equals("tr"))
{
try
{
element = element.FindElement(By.XPath("..")); //Returns the parent
}
catch
{
return null;
}
}
return element;
}
用法 -
public void Test()
{
IWebElement tableRow = GetParentTableRow(driver.FindElement(By.XPath("//td[contains(text(),'BBB')]"));
tableRow.FindElement(By.ClassName("chkPopupCod")).Click();
}
希望它有所帮助。 :)
答案 2 :(得分:0)
虽然最初的问题与 WebDriver 的 Java 版本有关,但如果有人在 .NET 中工作,那么有一个名为 TableDriver (https://github.com/jkindwall/TableDriver.NET) 的扩展可以帮助解决此类问题。最初的问题没有显示表格的完整 html,所以我不能确定它是如何应用的,但你应该能够做这样的事情:
Table table = Table.Create(driver.FindElement(By.Id("tableId")));
table.FindCell("\1=BBB", 0).Element.Click();
更新
TableDriver.Java 现已可用。详情请见:https://github.com/jkindwall/TableDriver.Java