Поиск по тексту и нажатие на чекбокс (При условии, что это разные элементы)

Есть выпадающее меню:

Проблема в том, что текст и чекбокс - это разные элементы.
Произвожу поиск по тесту:

for(WebElement l: List<WebElement>) {
    if (l.getText().equals(searchElement)) {
        l.click(); // так получается, что жмакается на текст
        break; 
    }
}

А вот как нажать на чек бокс, пока в раздумиях. Подскажите, кто сталкивался.

Пример DOM-а:

Через xpath можно найти элемент по тексту и жмякать по нему :smile:
Как нибудь так: //*[.‘Выбрать все’]/…/preceding-sibling::td/label

Почитайте это

Сделай лист вебэлементов по tr тэгу. Внутри цикла находишь два тд элемента относительно твоего tr - 1-ый - чекбокс, второй текст. И потом говоришь что если у второго элемента текст совпадает, то кликаем по первому элементу. Что то вроде этого :

List<WebElements> list = driver.findElements.byxpath("//*[@class='GIAUENBEQ'] //tr")
for (WebElement tr: list){
    WebElement checkBox = tr.findElement.byId("SelectItem_cbSelected");
    WebElement text = tr.findElement.byId("SelectItem.lText");
    if (text.getText().equals(searchElement)){
    checkBox.click();
    }
}

Это больше псевдокод, чем рабочий джава код, но думаю суть ты понял

1 лайк

Да, то что нужно! Спасибо!

Лучше бы все это написать через XPath грамотно, чем делать екстрастепы в коде.

Написать пример грамотного xPath можете?

Отталкивайтесь от моего примера, либо скиньте код страницы )

1 лайк

легко, скиньте пожалуйста кусок html-а, который на скрине.

 <div id="MultipleSelectionDropdown_dropDownBtn" class="btn-group" title="АРМ менеджера касира">
    <a class="btn" href="javascript:;" style="width: 361px; overflow: hidden;">
        <i/>
        АРМ менеджера касира 
    </a>
    <a class="btn dropdown-toggle" href="javascript:;" data-toggle="dropdown">
        <i/>
        <span class="caret"/>
    </a>
    <ul class="dropdown-menu" style="max-height: 150px; width: 250px; overflow: auto;">
        <div>
            <table class="GIAU1ENBEQ" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td align="left" style="vertical-align: top;">
                            <label id="SelectItem_cbSelected" class="checkbox" for="gwt-uid-160">
                                <input id="gwt-uid-160" type="checkbox" value="on" tabindex="0"/>
                                <span/>
                            </label>
                        </td>
                        <td align="left" style="vertical-align: top;">
                            <div id="SelectItem_lText" class="gwt-Label">Выбрать все</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="gwt-Label"/>
        <div>
            <table class="GIAU1ENBEQ" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td align="left" style="vertical-align: top;">
                            <label id="SelectItem_cbSelected" class="checkbox" for="gwt-uid-765">
                                <input id="gwt-uid-765" type="checkbox" value="on" tabindex="0"/>                                    <span/>
                                </label>
                        </td>
                        <td align="left" style="vertical-align: top;">
                            <div id="SelectItem_lText" class="gwt-Label">Терминалы  самообслуживания</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div>
            <table class="GIAU1ENBEQ" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td align="left" style="vertical-align: top;">
                            <label id="SelectItem_cbSelected" class="checkbox" for="gwt-uid-768">
                                <input id="gwt-uid-768" type="checkbox" value="on" tabindex="0"/>
                                <span/>
                            </label>
                        </td>
                        <td align="left" style="vertical-align: top;">
                            <div id="SelectItem_lText" class="gwt-Label">Интернет  банкинг</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div>
            <table class="GIAU1ENBEQ" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td align="left" style="vertical-align: top;">
                            <label id="SelectItem_cbSelected" class="checkbox" for="gwt-uid-771">
                                <input id="gwt-uid-771" type="checkbox" value="on" tabindex="0" checked=""/>
                                <span/>
                            </label>
                        </td>
                        <td align="left" style="vertical-align: top;">
                            <div id="SelectItem_lText" class="gwt-Label">АРМ менеджера касира</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </ul>
</div>

//div[text()=‘Выбрать все’]//…//…//input[contains(@id,‘gwt-uid’)]

Можно просто создать метод, который будет пассить по какому лейблу искать нужный вам чекбокс.

public void clickOnCheckBoxUSingItsLabel(string labelText)
{
     IWebElement checkBox = WebDriver.FindElement(By.XPath(string.Format("//div[text()='{0}']//..//..//input[contains(@id,'gwt-uid')]", labelText)));
    checkBox.Click();
}
1 лайк

Спасибо! Все таки лучше создам(создал) метод. В моем случае это будет попрактичнее. Но ваш пример xPath-a, на заметку взял.

1 лайк

Я бы запилил какой-нить xPath типа

//tr[contains(., 'Выбрать все')]//input[@type='checkbox']

И вместо “Выбрать все” подставлять соответствующий текст для чек-бокса