Как получить эти поля ввода с динамическими идентификаторами

У меня есть веб-страница, на которой есть несколько текстовых полей, которые нужно заполнить некоторыми значениями с помощью Selenium WebDriver. Но я не могу получить эти элементы с помощью API-интерфейсов, предоставляемых в selenium framwework, потому что идентификаторы динамически меняются.

Например, одно из текстовых полей имеет следующий идентификатор

<input id="order_unit_line_rate_806099_unit_price" type="text" value="" uniqueattr="Dynamic Site Accelerator / Dynamic Site Accelerator / Platform Fee / / Price" size="10" onchange="javascript:numberFormatValid('order_unit_line_rate_806099_unit_price', parseI18nNumber($('order_unit_line_rate_806099_unit_price').value, ',', '.'), 5, '.');" name="order_unit_line_rate[806099][unit_price]">

где цифры 806099, которые являются частью идентификатора, различаются для каждой новой страницы и каждого нового текстового поля. Мне не повезло с использованием API findElements(By.id()).

может кто-нибудь предложить какой-либо подход для определения этих элементов.

Я использую eclipse в качестве редактора, java в качестве клиентского драйвера и selenium webDriver в качестве среды автоматизации.

Спасибо Киран


person Kiran Koundinya    schedule 29.06.2012    source источник
comment
То же самое происходит, когда я пытаюсь использовать findElement.(By.name()); потому что имя также содержит 6-значный номер. \n Могу ли я использовать здесь регулярное выражение? ?   -  person Kiran Koundinya    schedule 29.06.2012


Ответы (3)


Вы можете использовать findElementsByTagName, а затем циклически перебирать каждый возвращаемый элемент, сверяя его идентификатор с вашим регулярным выражением:

public static WebElement findElementByRegexId(FindsByTagName ctx, String tagName, String regex) {
    List<WebElement> l = ctx.findElementsByTagName(tagName);
    for (WebElement e : l) {
        if (e.getAttribute("id").matches(regex)) {
            return e;
        }
    }
    return null;
}
person Zarkonnen    schedule 29.06.2012
comment
спасибо за ответ :) .. Попробую это и свяжусь с вами по наблюдениям :) - person Kiran Koundinya; 29.06.2012
comment
это был идеальный ответ, который я искал. Спасибо миллион за этот ответ :). - person Kiran Koundinya; 01.07.2012

Selenium API также позволяет вам передавать локаторы XPath, поэтому вы, вероятно, можете попробовать что-то вроде

findElements(By.xpath("//input[@uniqueattr=\"Dynamic Site Accelerator / Dynamic Site Accelerator / Platform Fee / / Price\"]"));

Подробнее см. здесь.

person Didier L    schedule 29.06.2012
comment
@Didlier: спасибо за ответ, приятель :) .. Попробую это и вернусь к вам по наблюдениям :) - person Kiran Koundinya; 29.06.2012
comment
@Didler: это ошибка, которую я получил, используя это. org.openqa.selenium.NoSuchElementException: невозможно найти элемент: {method:xpath,selector://input[@uniqueattr=\Dynamic Site Accelerator / Dynamic Site Accelerator / Плата за платформу // Цена\]} - person Kiran Koundinya; 29.06.2012
comment
Я только что попробовал в Selenium IDE, и, похоже, он работает, попробуйте сделать то же самое, чтобы проверить предложенный XPath. Также стоит обратить внимание на кавычки и экранирование. Может быть, вы можете попробовать с одинарными кавычками, например: findElements(By.xpath("//input[@uniqueattr='Dynamic Site Accelerator / Dynamic Site Accelerator / Platform Fee / / Price']"));. Проблема с таким XPath (содержащим удобные для пользователя метки) заключается в том, что он очень подвержен ошибкам. Нельзя ли добавить технический атрибут или, может быть, использовать атрибут класса? Возможно, проблема в том, что uniqueattr не является стандартным атрибутом. - person Didier L; 29.06.2012
comment
вы правы, @unique не является стандартным атрибутом, это атрибут, добавленный нашей командой разработчиков, и я обнаружил, что для него нет API для выполнения get() :( .. - person Kiran Koundinya; 29.06.2012

Вместо использования регулярного выражения вы можете использовать решение ниже

//input[contains(@name, 'order_unit_line_rate')] 
person Rohit Ware    schedule 29.06.2012
comment
@Спасибо, Рохит, но есть еще много элементов с той же начальной строкой, например, флажки. Текстовые поля, которые мне нужно заполнить, имеют имена order_unit_line_rate[806099][unit_price] или order_unit_line_rate[806099][limit_price] . поэтому мне нужно проверить ту часть строки, которая следует за 6-значным числом. Любые комментарии по этому поводу - person Kiran Koundinya; 29.06.2012
comment
Вы можете использовать текст unit_price ИЛИ limit_Price. Это сработает для вас?? - person Rohit Ware; 29.06.2012
comment
Я перепробовал все эти Rohit :( но уже несколько дней Не могу найти локатор :(. Я также попробовал синтаксис ur с @uniqueattr, но снова не повезло :( .. Есть еще предложения? - person Kiran Koundinya; 29.06.2012