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

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

java
Теги: #<Tag:0x00007f7b64b72d48>

(Stanislav Kandirov) #1

Здравствуйте, подскажите пожалуйста, может кто знает, есть необходимость обращаться к элементу по его 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.


QA weekly #37: тестированиe мобильных приложений, Tests Coverage, 50+ вопросов по тестированию web api, ID веб элементов, аддон тестировщика
(Сергей Кузьмин) #2

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


(Stanislav Kandirov) #3

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


(Сергей Кузьмин) #4

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


(Евгений) #5

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


(Maxim Andryushchenkov) #6

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

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

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


(Bohdan B) #7

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


(Sergey Rybakin) #8

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

Effective CSS Selectors (англ)


(Vatslau) #9
 public static String nodeContainsClass(String className) {
    return String.format("//*[contains(@class, '%s')]", className);
  }

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

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


(Stanislav Kandirov) #10

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


(Сергей Кузьмин) #11

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

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

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


(Stanislav Kandirov) #12

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


(Сержан Есенбек) #13

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


(Bohdan Kuso) #14

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


(Eugene Shapovalov) #15

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

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

В чем отличие:
https://trueautomation.io/docs/#/getting-started/trueautomation-vs-selenium

Java example:
https://trueautomation.io/docs/#/languages-frameworks/java-maven


(asolntsev) #16

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