Как выбрать один флажок среди нескольких полей на основе текста метки - PullRequest
0 голосов
/ 12 июля 2020

Привет, я пытаюсь автоматизировать сценарий, в котором поиск запускается с использованием названия города, и это даст мне список доступных центров тестирования в городе с флажками для выбора необходимого центра тестирования. Я пробовал много способов, но не смог выбрать центр тестирования на основе «почтового кода», доступного в тексте метки.

Есть 2 центра тестирования (testCenter_1 и testCenter_2), как показано в коде ниже, и каждый центр тестирования имеет флажок, а его адрес отображается в теге метки. Я пытаюсь найти и выбрать Центр тестирования 2 на основе его почтового индекса (HP19 8GJ) в теге метки.

<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>

Нажмите здесь, чтобы увидеть снимок экрана с кодом

Я мог выбрать 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();

Чтобы найти центр тестирования 2 на основе текста метки и установить флажок, я использовал строку ниже но это дает мне ElementNotInteractableException.

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

Предложения, пожалуйста?

Заранее спасибо

1 Ответ

0 голосов
/ 14 июля 2020

Как предлагается @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);

EDIT :

Если вы хотите выполнить поиск во всех центрах тестирования, вы можете использовать один из следующих 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]
...