如何根据标签文本select在多个框中选择一个复选框
How to select a single check box among multiple boxes based on the label text
您好,我正在尝试自动执行使用城市名称启动搜索的场景,这会给我提供城市中可用的考试中心列表,其中包含用于选择所需考试中心的复选框。我尝试了很多方法,但未能 select 基于标签文本中可用的 'Post code' 的测试中心。
有2个考点(testCenter_1和testCenter_2)如下代码所示,每个考点都有一个复选框,其地址显示在label标签中。我正在尝试根据标签标签中的 post 代码 (HP19 8GJ) 定位并 select 测试中心 2。
<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>
Please click here to see the screenshot of code
我可以 select testCenter_2 使用 xpath 和 id,如下所示,但无法想出一个通用定位器来根据标签文本识别一个测试中心。
注意:我在这里使用了元素可见性条件,因为搜索结果显示在页面底部。
WebDriverWait wait = new WebDriverWait(driver, 10000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*@id='selectedTestCenters:2']")));
driver.findElement(By.xpath("//*[@id='selectedTestCenters:2']")).click();
为了根据标签文本和 select 复选框定位测试中心 2,我使用了下面一行,但它给了我 ElementNotInteractableException。
driver.findElement(By.xpath("//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]")).click();
有什么建议吗?
提前致谢
按照@pburgr 的建议,使用elementToBeClickable
条件是一种选择。此外,如果您定位 input
元素而不是 label
可能会更好。您可以相应地修复您的 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
元素):
//*[@id='testCenterListTable']//tr/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]
//*[@id='testCenterListTable']/tr[*]/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]
您好,我正在尝试自动执行使用城市名称启动搜索的场景,这会给我提供城市中可用的考试中心列表,其中包含用于选择所需考试中心的复选框。我尝试了很多方法,但未能 select 基于标签文本中可用的 'Post code' 的测试中心。
有2个考点(testCenter_1和testCenter_2)如下代码所示,每个考点都有一个复选框,其地址显示在label标签中。我正在尝试根据标签标签中的 post 代码 (HP19 8GJ) 定位并 select 测试中心 2。
<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>
Please click here to see the screenshot of code
我可以 select testCenter_2 使用 xpath 和 id,如下所示,但无法想出一个通用定位器来根据标签文本识别一个测试中心。 注意:我在这里使用了元素可见性条件,因为搜索结果显示在页面底部。
WebDriverWait wait = new WebDriverWait(driver, 10000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*@id='selectedTestCenters:2']")));
driver.findElement(By.xpath("//*[@id='selectedTestCenters:2']")).click();
为了根据标签文本和 select 复选框定位测试中心 2,我使用了下面一行,但它给了我 ElementNotInteractableException。
driver.findElement(By.xpath("//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]")).click();
有什么建议吗?
提前致谢
按照@pburgr 的建议,使用elementToBeClickable
条件是一种选择。此外,如果您定位 input
元素而不是 label
可能会更好。您可以相应地修复您的 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
元素):
//*[@id='testCenterListTable']//tr/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]
//*[@id='testCenterListTable']/tr[*]/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]