Определение динамического ID веб элементов.

Здравствуйте, подскажите пожалуйста, может кто знает, есть необходимость обращаться к элементу по его ID, в моем случае это поля для ввода текста, ID каждый раз меняется так же как и текст поля.

<div class="blocks-rows" data-task-id="85717">

	<div id="block_1300263" class="block-input empty-text" data-placeholder="Enter text here" data-text-prev="" data-url-edit="http://test.env.testsite.com/task/85717" data-block-id="1300263"></div>
	...
	<div id="block_1300297" class="block-input empty-text" data-placeholder="Enter text here" data-text-prev="" data-url-edit="http://test.env.testsite.com/task/85717" data-block-id="1300297"></div>

нужны эти значения : id=“block_1300263”, id=“block_1300297”, прошу подсказать как могу вытащить эти значения?
использую java, selenide.

@g100m5 простите а нет рядом с ним <label for=" block_ 1300263"...> ?

к сожалению, нет

ну если этот id нигде больше не присутствует то и строить на его юоснове локатор наверное не стоит. для Selenium’ а все равно как вы создадите WebElement instance - он поддержит sendKeys

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

1 лайк

Ну для этого есть XPATH, можно вот так попробовать:

//div[starts-with(@id, 'block_')]

Только ищите все элементы, а не один. И вы должны списком получить все элементы по такому запросу. А потом заполняйте эти поля как вам нужно

Для этого есть СSS
'div[id^="block_"]'

Можно я сюда прикреплю ссылочку?
Ну что бы большинство возможных комбинаций было “покрыто”?

Effective CSS Selectors (англ)

1 лайк
 public static String nodeContainsClass(String className) {
    return String.format("//*[contains(@class, '%s')]", className);
  }

1 вместо класс вставляете любой свой аттрибут
2 получаете массив элементов с динамичестими айди
3. пробегаете циклом - вызывая на каждом get атрибута(можно забрать html element и стринг утилз сматчить методом between Strings - если так проще)
4. сохраняете в массив ну и дальше что Вам нужно используете

в вообще выглядит как неполная вёрстка…
уверен что дивах есть персонализированная инфа на которую тожно заякорится и взять елемент родителя

1 лайк

А нет случайно примера 3-го пункта? буду признателен

я дико извиняюь вот может подойдет вам

	  .findElements(
    By.cssSelector("div.container div.row div.intro-message h3"))
.stream().filter(_element -> _element.getText().toLowerCase()
    .indexOf("select your hobbies") > -1)
.findFirst().get();

времени адаптирвать подваше сейчас нету - рабьоту никто не отменялло

Спасибо Вам, попробую.

Попробуйте так //div[contains(@id,‘block_’)]

Я бы сделал так: $$x("//*[contains (@id, ‘block_’)]"). А дальше for each`ом для каждого SelenideElement i: i.getAttribute(“id”).replaceAll(“block_”, “”)

1 лайк

Советую обратить внимание на Test Automation tool: www.trueautomation.io

Фактически тула помогает работать с динамическими элементами в dom. TrueAutomation базируется на Selenium и использует его API. Сейчас тула работает с Ruby (Capybara) и Java (off API)

В чем отличие:

Java example:

Пролистал описание этого тула - вообще не понимаю, как он может помочь с описанной проблемой. Если айдишников нет, никакая магия их не создаст.

5 лайков