如何根据标签文本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">&nbsp;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">&nbsp;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]