Обращение к кнопке по тексту кнопки, Webdriver

Добрый день. Подскажите пожалуйста.
Как сделать клик по кнопке зная только текст кнопки?

xpath будет таким “//input[@value=‘YOUR_TEXT’]”

Сделал вот так:
driver.findElement(By.xpath("//input[@name=’" + line + “’]”)).click();
driver.findElement(By.xpath("//input[@value=’" + line + “’]”)).click();
не помогло.

Что значит - не помогло? Какая ошибка вышла?
Какой код этой кнопки?
Много ли таких кнопок с одинаковым текстом?

org.openqa.selenium.NoSuchElementException: Unable to locate element: {“method”:“xpath”,“selector”:“//input[@name=‘Travel Card’]”}
Command duration or timeout: 10.16 seconds
For documentation on this error, please visit: Selenium
Build info: version: ‘2.49.1’, revision: ‘b41a073’, time: ‘2016-01-21 17:32:24’

У каждой кнопки разный текст.

А селектом там нельзя? Это же дропдаун.

А как селектом сделать? Мне надо нажать на кнопку зная только текст из файла.

дропдаун я открываю через

driver.findElement(By.xpath(viewCard)).click();

viewCard в другом классе xpath

1 лайк

Тогда исходник html в студию.
Ибо я думал у вас обычный input.
А тут у вас другое.
Давайте кусок кода с селектом Travel Card.

Вот html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<body id="overlay" style="position: relative;">
<div id="layout">
<form id="reclame" class="" enctype="application/x-www-form-urlencoded" action="/cardCreatePage.xhtml" method="post" name="reclame">
<div id="textarea_simulator" style="position: absolute; top: 0px; left: 0px; visibility: hidden;"></div>
<div id="j_idt13_blocker" class="ui-blockui ui-widget-overlay ui-helper-hidden"></div>
<div id="j_idt13" class="ui-blockui-content ui-widget ui-widget-content ui-corner-all ui-helper-hidden ui-shadow">
<div id="mainForm:growlId_container" class="ui-growl ui-widget" style="z-index: 1001;"></div>
<div id="mainForm:attrRecords:4:fieldType2_panel" class="ui-selectonemenu-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow" style="width: 380px; display: block; z-index: 1003; top: 0.000300781px; left: 581.5px;">
<div class="ui-selectonemenu-items-wrapper" style="height:auto">
<ul class="ui-selectonemenu-items ui-selectonemenu-list ui-widget-content ui-widget ui-corner-all ui-helper-reset">
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all ui-state-highlight" data-label="Travel Card">Travel Card</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Visa Classic">Visa Classic</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Visa Electron">Visa Electron</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Visa Gold">Visa Gold</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Visa Platinum">Visa Platinum</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="БЕЛКАРТ-ПРЕМИУМ (Моцная картка)">БЕЛКАРТ-ПРЕМИУМ (Моцная картка)</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Детская карточка">Детская карточка</li>
<li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="ТАЛАКА">ТАЛАКА</li>
</ul>
</div>
</div>
<div id="mainForm:attrRecords:5:fieldType2_panel" class="ui-selectonemenu-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow" style="width: 380px;">
<div id="mainForm:attrRecords:6:fieldType2_panel" class="ui-selectonemenu-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow" style="width: 380px;">
<div id="mainForm:attrRecords:7:fieldType2_panel" class="ui-selectonemenu-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow" style="width: 380px;">
</body>
</html>

Как простой вариант (python):

# кликаем на элемент ul
drive.find_element_by_xpath("html/body/div[7]/ul").click()
# потом ищем наш пункт меню
li_elements = drive.find_elements_by_xpath("html/body/div[7]/ul/li") # получили массив из li элементов
for el in li_elements:
    if el.text == "Visa Classic" # например этот пункт
        el.click()
        break

Либо держите массив этих элементов меню (index и значение):

Visa Classic - 1
Visa Electron - 2
и т..д
где 1,2, 3  - это indexes

Тогда можно без перебора кликнуть:

drive.find_elements_by_xpath("html/body/div[7]/ul/li[" + index + "]") # кликаем на нужный li

Ну и есть еще вариант:
наверняка там есть скрытый select
тогда js скриптом сделать его видимым
а с ним уже легко

Спасибо, сделал вот так: driver.findElement(By.xpath("//div[6]/div/ul/li[text()=’" + line + “’]”)).click();

Не надо так. Слишком длинный путь //div[6]/div/ul/li[text()='" + line + "']
А что если html чуть-чуть изменят?

1 лайк

Столкнулся недавно с такой проблемой можно сделать как вы сделали, но у меня иногда вылетал ексепшн что поле не найдено, не успевало подгрузиться, а паузу ставить не хотел, решил проблему перебором текста через цикл, //*[@id=“buy-block”]ul/li[“i”]/span@data-val

Если на странице несколько однотипных элементов, которые отличаются только innerText, то находим все эти элементы и внутри массива перебираем их, пока не попадём на тот, у которого будет искомый innerText.

А можете ссылку дать на эту страницу, если она в свободном доступе? напишу вам нормальны xpath, а не то что тут вам писали, ибо правильный Х-путь должен примерно выглядеть так - //li[@data-label=‘Visa Classic’]

1 лайк