Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

webdriver
java
testng
Теги: #<Tag:0x00007f7b69fec3b0> #<Tag:0x00007f7b69fec0b8> #<Tag:0x00007f7b69ff7e40>

(Denis Vovchenko) #1

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

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

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

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

Пример DOM-а:


(rmerkushin) #2

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

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


(Andrew Zakordonets) #3

Сделай лист вебэлементов по 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();
    }
}

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


(Denis Vovchenko) #4

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


(Eugene Tkachenko) #5

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


(Denis Vovchenko) #6

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


(rmerkushin) #7

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


(Eugene Tkachenko) #8

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


(Denis Vovchenko) #9
 <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>

(Eugene Tkachenko) #10

//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();
}

(Denis Vovchenko) #11

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


(Pavel Ordenko) #13

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

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

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