Java 如何基于标签文本在多个框中选择单个复选框
您好,我正在尝试自动化一个场景,其中使用城市名称启动搜索,这将为我提供城市中可用的测试中心列表,并带有复选框以选择所需的测试中心。我尝试了很多方法,但未能根据标签文本中可用的“Post code”选择测试中心 有两个测试中心(testCenter_1和testCenter_2),如下代码所示,每个测试中心都有一个复选框,其地址显示在标签标签中。我试图根据标签标签中的邮政编码(HP19 8GJ)定位并选择测试中心2Java 如何基于标签文本在多个框中选择单个复选框,java,selenium,xpath,checkbox,label,Java,Selenium,Xpath,Checkbox,Label,您好,我正在尝试自动化一个场景,其中使用城市名称启动搜索,这将为我提供城市中可用的测试中心列表,并带有复选框以选择所需的测试中心。我尝试了很多方法,但未能根据标签文本中可用的“Post code”选择测试中心 有两个测试中心(testCenter_1和testCenter_2),如下代码所示,每个测试中心都有一个复选框,其地址显示在标签标签中。我试图根据标签标签中的邮政编码(HP19 8GJ)定位并选择测试中心2 <div class="container">
<div class="container">
<div class="row">
<div class="col-md-7 col-sm-12">
<div id="testCenterList">
<div style="visibility:hidden;">
</div>
<table cellspacing="0" id="centerTable">
<caption class="access">This table lists the test centres closest to the area that searched </caption>
<thead>…</thead>
<tbody id="testCenterListTable">
<tr id="testCenter_1" class="group0">
<td class="selectRow displayDesktopOnlyView" scope="row">
<input id="selectedTestCenters:1" type="checkbox" name="selectedTestCenters" value="48958">
<label for="selectedTestCenters:1" class="access"> Pearson Centre - 9 Lloyds Street Northampton NN1 2NP</label>
</td>
</tr>
<tr id="testCenter_2" class="group0">
<td class="selectRow displayDesktopOnlyView" scope="row">
<input id="selectedTestCenters:2" type="checkbox" name="selectedTestCenters" value="79312">
<label for="selectedTestCenters:2" class="access"> Pearson Centre - 5 Smeaton Close Aylesbury HP19 8GJ</label>
</td>
<td>
</tr>
要根据标签文本定位测试中心2并选中复选框,我在下面的行中使用了,但它给了我ElementNotInteractiableException
driver.findElement(By.xpath("//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]")).click();
有什么建议吗
如@pburgr建议的那样,提前感谢您,使用
元素可禁用条件是选项之一。另外,如果以输入
元素为目标,而不是标签
可能会更好。您可以相应地修复XPath:
//label[contains(text(),'HP19 8GJ')]/preceding::input[1]
如果前面的选项不起作用,请使用JSE单击元素:
WebElement ele = driver.findElement(By.xpath("//label[contains(text(),'HP19 8GJ')]/preceding::input[1]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
编辑:
如果要在所有测试中心内搜索,可以使用以下XPath之一(使用/
或[*]
检查每个tr
元素):
将html代码作为文本,以便我们可以测试它。不要使用图像。请阅读为什么使用图像。考虑使用格式化的基于文本的相关HTML、代码试验和错误堆栈跟踪更新问题。谢谢@ Alxyr。还有DebanjanB,我很感谢你对代码的建议。当我复制元素或外部html时,它返回1000多行。因此,除了一个测试中心外,我删除了所有测试中心标记中的内容。请让我知道问题中包含的代码是否正常?html代码中没有选择或复选框。你能详细说明你的问题是什么吗?添加您的代码、预期行为和当前行为/异常。感谢@pburgr对此进行调查。我现在更新了问题和代码,以使其更清晰。请看一看,让我知道它是否仍然缺少任何细节。太好了!!这对我有用。非常感谢@E.Wiest。早些时候,我试图通过定位输入标记来单击该框,但失败了,因为文本位于标签中。我以前从未遇到过前面的选项。然而,我的问题只解决了一半。邮政编码并不总是出现在同一位置,它可能出现在列表的第一位或第五位。因此,我可以使用任何替代选项来查看具有给定文本的所有测试中心,而不是直接在这一行中以第二个测试中心(tr[2])为目标吗<代码>xpath(“//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]/previous::input[1]”
确定。如果要在所有测试中心内搜索,可以使用以下XPath之一(使用//
或[*]
检查每个tr
元素)://*[@id='testCenterListTable']///tr/td/label[contains(text(),'HP19 8GJ')]/previous::input[1]
或/*[@id='testCenterListTable']/tr[*]/td/label[contains(text()),'HP19 8GJ')]/previous::input[1]
。完美!这就是我要找的。谢谢:)很高兴我能帮忙。评论已添加到我原来的帖子中。如果你的问题解决了,请随意将其标记为已接受。
WebElement ele = driver.findElement(By.xpath("//label[contains(text(),'HP19 8GJ')]/preceding::input[1]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
//*[@id='testCenterListTable']//tr/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]
//*[@id='testCenterListTable']/tr[*]/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]