【问题标题】:How to select a single check box among multiple boxes based on the label text如何根据标签文本在多个框中选择单个复选框
【发布时间】:2020-07-17 16:49:20
【问题描述】:

您好,我正在尝试自动化使用城市名称启动搜索的场景,这将为我提供该城市可用考试中心的列表,并带有复选框以选择所需的考试中心。我尝试了很多方法,但未能根据标签文本中提供的“邮政编码”选择考试中心。

如下代码所示,有2个考点(testCenter_1和testCenter_2),每个考点都有一个复选框,其地址显示在label标签中。我正在尝试根据标签标签中的邮政编码 (HP19 8GJ) 定位并选择测试中心 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

我可以使用 xpath 和 id 选择 testCenter_2,如下所示,但无法提供一个通用定位器来根据标签文本识别一个测试中心。 注意:我在这里使用了元素可见性条件,因为搜索结果显示在页面底部。

WebDriverWait wait = new WebDriverWait(driver, 10000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*@id='selectedTestCenters:2']")));
driver.findElement(By.xpath("//*[@id='selectedTestCenters:2']")).click();

要根据标签文本定位测试中心 2 并选中复选框,我使用了下面的行,但它给了我 ElementNotInteractableException。

driver.findElement(By.xpath("//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]")).click();

请给点建议?

提前致谢

【问题讨论】:

  • 将html代码作为文本,以便我们测试。不要使用图片。
  • 请阅读为什么是screenshot of HTML or code or error is a bad idea。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。
  • 谢谢@AlexeyR。和 DebanjanB,感谢您对代码的建议。当我复制元素或外部 html 时,它返回超过 1000 行。因此,我已经删除了除一个之外的所有测试中心的标签内的内容。如果问题中包含的代码看起来不错,请告诉我?
  • 在 html 代码中没有选择或复选框。你能详细说明你的问题是什么吗?添加您的代码、预期行为和当前行为/异常。
  • 感谢@pburgr 对此进行调查。我现在更新了问题和代码以更清晰。请看一下,如果它仍然缺少任何细节,请告诉我。

标签: java selenium xpath checkbox label


【解决方案1】:

正如@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]

【讨论】:

  • 太棒了!!这对我有用。非常感谢@E.Wiest。早些时候,我尝试通过定位输入标签来单击该框,但由于文本位于标签中而失败。我以前从未遇到过前面的选项。然而我的问题只解决了一半。邮政编码并不总是出现在相同的位置,它可能出现在列表的第一个或第 5 个。那么我可以使用任何替代选项来查看具有给定文本的所有测试中心,而不是直接在这一行中定位第二个测试中心(tr[2])吗? xpath("//*[@id='testCenterListTable']/tr[2]/td/label[contains(text(),'HP19 8GJ')]/preceding::input[1]")
  • 当然。如果您想在所有测试中心内搜索,您可以使用以下 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]
  • 完美!这就是我要找的。谢谢你:)
  • 很高兴我能帮上忙。评论已添加到我的原始帖子中。如果您的问题得到解决,请随时将其标记为已接受。
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多