Перейти к содержимому

Фотография

Динамические ID

selenuim java динамические id

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 22

#1 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 07:44

Добрый день, коллеги!

 

Работал, работал, автоматизировал, автоматизировал и тут на тебе, появляется новый проект с другими разработчиками (разработчики предыдущих проектов были сразу ориентированы на автотесты и делали всё, для облегчения их написания). Новые разработчики знать не знали о задаче по автоматизации тестирования, в связи с чем разрабатывали, как обычно, без оглядки на автотесты.

В связи с этим возникла проблема с динамическими ID, как за них цепляться? Можно по xPath, конечно, но тут вопрос стабильности, проекты постоянно дорабатываются, постоянно что-то добавляется и xPath получается недолговечен...

Все остальные параметры атрибутов у однотипных полей одинаковые


  • 0

#2 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 мая 2015 - 07:55

Добрый день!

Выложите код страницы на которой этот элемент


  • 0

#3 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 08:04

Весь, конечно, не буду выкладывать, там куча всего
Но вот интересующий раздел с 3-мя полями фильтров:
 

<div id="headercontainer-1068-innerCt" class="x-box-inner " role="presentation" style="width: 1005px; height: 48px;">
<div id="headercontainer-1068-targetEl" class="x-box-target" role="presentation" style="width: 1005px;">
<div id="gridcolumn-1069" class="x-column-header x-column-header-align-left x-box-item x-column-header-default x-unselectable x-column-header-first" style="border-width: 1px; width: 100px; right: auto; left: 0px; top: 0px; margin: 0px; cursor: col-resize;">
<div id="gridcolumn-1069-titleEl" class="x-column-header-inner" role="presentation">
<span id="gridcolumn-1069-textEl" class="x-column-header-text">Код</span>
<div id="gridcolumn-1069-triggerEl" class="x-column-header-trigger" role="presentation" style="cursor: col-resize;"></div>
</div>
<div class="gr-filter-position-fix"></div>
<div id="container-1082" class="x-container x-gridheaderfilters-filter-container x-container-default x-border-box" style="border-width:0;width:100px;">
<span id="container-1082-outerCt" role="presentation" style="display: table; width: 100%; table-layout: fixed;">
<div id="container-1082-innerCt" class="" role="presentation" style="display:table-cell;height:100%;vertical-align:top;">
<table id="textfield-1081" class="x-field x-gridheaderfilters-filter-field x-table-plain x-form-item x-form-type-text x-field-default x-anchor-form-item" cellpadding="0" role="presentation" style="table-layout: fixed; width: 99px;">
<tbody>
<tr id="textfield-1081-inputRow" class="x-form-item-input-row" role="presentation">
<td id="textfield-1081-labelCell" class="x-field-label-cell" width="105" valign="top" halign="left" style="display:none;" role="presentation">
<label id="textfield-1081-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:100px;margin-right:5px;" for="textfield-1081-inputEl">Код</label>
</td>
<td id="textfield-1081-bodyEl" class="x-form-item-body " colspan="3" role="presentation" style="width: 100%;">
<input id="textfield-1081-inputEl" class="x-form-field x-form-text" type="text" autocomplete="off" name="textfield-1081-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">
</td>
</tr>
</tbody>
</table>
</div>
</span>
</div>
</div>
<div id="gridcolumn-1070" class="x-column-header x-column-header-align-left x-box-item x-column-header-default x-unselectable" style="border-width: 1px; width: 100px; right: auto; left: 100px; top: 0px; margin: 0px; cursor: col-resize;">
<div id="gridcolumn-1070-titleEl" class="x-column-header-inner" role="presentation">
<span id="gridcolumn-1070-textEl" class="x-column-header-text">Код СКК</span>
<div id="gridcolumn-1070-triggerEl" class="x-column-header-trigger" role="presentation" style="cursor: col-resize;"></div>
</div>
<div class="gr-filter-position-fix"></div>
<div id="container-1084" class="x-container x-gridheaderfilters-filter-container x-container-default x-border-box" style="border-width:0;width:100px;">
<span id="container-1084-outerCt" role="presentation" style="display: table; width: 100%; table-layout: fixed;">
<div id="container-1084-innerCt" class="" role="presentation" style="display:table-cell;height:100%;vertical-align:top;">
<table id="textfield-1083" class="x-field x-gridheaderfilters-filter-field x-table-plain x-form-item x-form-type-text x-field-default x-anchor-form-item" cellpadding="0" role="presentation" style="table-layout: fixed; width: 99px;">
<tbody>
<tr id="textfield-1083-inputRow" class="x-form-item-input-row" role="presentation">
<td id="textfield-1083-labelCell" class="x-field-label-cell" width="105" valign="top" halign="left" style="display:none;" role="presentation">
<label id="textfield-1083-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:100px;margin-right:5px;" for="textfield-1083-inputEl">Код СКК</label>
</td>
<td id="textfield-1083-bodyEl" class="x-form-item-body " colspan="3" role="presentation" style="width: 100%;">
<input id="textfield-1083-inputEl" class="x-form-field x-form-text " type="text" autocomplete="off" name="textfield-1083-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">
</td>
</tr>
</tbody>
</table>
</div>
</span>
</div>
</div>
<div id="gridcolumn-1071" class="x-column-header x-column-header-align-left x-box-item x-column-header-default x-unselectable x-column-header-last" style="border-width: 1px; right: auto; left: 200px; top: 0px; margin: 0px; width: 788px;">
<div id="gridcolumn-1071-titleEl" class="x-column-header-inner" role="presentation">
<span id="gridcolumn-1071-textEl" class="x-column-header-text">Наименование</span>
<div id="gridcolumn-1071-triggerEl" class="x-column-header-trigger" role="presentation"></div>
</div>
<div class="gr-filter-position-fix"></div>
<div id="container-1086" class="x-container x-gridheaderfilters-filter-container x-container-default x-border-box" style="border-width: 0px; width: 787px;">
<span id="container-1086-outerCt" role="presentation" style="display: table; width: 100%; table-layout: fixed;">
<div id="container-1086-innerCt" class="" role="presentation" style="display:table-cell;height:100%;vertical-align:top;">
<table id="textfield-1085" class="x-field x-gridheaderfilters-filter-field x-table-plain x-form-item x-form-type-text x-field-default x-anchor-form-item" cellpadding="0" role="presentation" style="table-layout: fixed; width: 786px;">
<tbody>
<tr id="textfield-1085-inputRow" class="x-form-item-input-row" role="presentation">
<td id="textfield-1085-labelCell" class="x-field-label-cell" width="105" valign="top" halign="left" style="display:none;" role="presentation">
<label id="textfield-1085-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:100px;margin-right:5px;" for="textfield-1085-inputEl">Наименование</label>
</td>
<td id="textfield-1085-bodyEl" class="x-form-item-body " colspan="3" role="presentation" style="width: 100%;">
<input id="textfield-1085-inputEl" class="x-form-field x-form-text " type="text" autocomplete="off" name="textfield-1085-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">
</td>
</tr>
</tbody>
</table>
</div>
</span>
</div>
</div>
</div>
</div>
</div>

  • 0

#4 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 мая 2015 - 08:12

И название полей укажите пожалуйста =)


  • 0

#5 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 08:15

Названия полей? Они есть в коде =)

<span id="gridcolumn-1069-textEl" class="x-column-header-text">Код</span>

<span id="gridcolumn-1070-textEl" class="x-column-header-text">Код СКК</span>

<span id="gridcolumn-1071-textEl" class="x-column-header-text">Наименование</span>

 

Или я не правильно понимаю о каких названиях идет речь?


  • 0

#6 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 мая 2015 - 08:37

Вы все правильно поняли.

Можно так:

(//*[@class = 'x-column-header-text'])[1]

(//*[@class = 'x-column-header-text'])[2]

(//*[@class = 'x-column-header-text'])[3]

Можно еще так:

//span[contains(text(), 'Код')]

//span[contains(text(), 'Код СКК')]

//span[contains(text(), 'Наименование')]


  • 0

#7 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 08:43

Сейчас попробую, а подскажите еще в одном месте, дальше, думаю, разберусь по аналогии:

<table id="remote-picker-1337" class="x-field x-table-plain x-form-item x-form-type-text x-field-default x-anchor-form-item" cellpadding="0" role="presentation" style="table-layout: fixed; width: 292px;">
<tbody>
<tr id="remote-picker-1337-inputRow" class="x-form-item-input-row" role="presentation">
<td id="remote-picker-1337-labelCell" class="x-field-label-cell" width="155" valign="top" halign="left" style="" role="presentation">
<label id="remote-picker-1337-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:150px;margin-right:5px;" for="remote-picker-1337-inputEl">Группа продавцов</label>
</td>
<td id="remote-picker-1337-bodyEl" class="x-form-item-body " colspan="2" role="presentation" style="width: 100%;">
<table id="remote-picker-1337-triggerWrap" class="x-form-trigger-wrap" cellspacing="0" cellpadding="0" role="presentation" style="width: 100%; table-layout: fixed;">
<tbody role="presentation">
<tr role="presentation">
<td id="remote-picker-1337-inputCell" class="x-form-trigger-input-cell" role="presentation" style="width: 100%;">
<div id="ext-gen2047" class="x-hide-display x-form-data-hidden" role="presentation"></div>
<input id="remote-picker-1337-inputEl" class="x-form-field x-form-text " type="text" name="saleGroupId" autocomplete="off" role="combobox" style="width: 100%;">
</td>
<td id="ext-gen2045" class=" x-trigger-cell x-unselectable" valign="top" style="width:17px;" role="presentation">
<div id="ext-gen2043" class="x-trigger-index-0 x-form-trigger x-form-search-trigger x-form-trigger-first" role="presentation"></div>
</td>
<td id="ext-gen2046" class=" x-trigger-cell x-unselectable" valign="top" style="width:17px;" role="presentation">
<div id="ext-gen2044" class="x-trigger-index-1 x-form-trigger x-form-clear-trigger" role="presentation"></div>
</td>
</tr>
</tbody>
</table>
</td>
<td id="remote-picker-1337-sideErrorCell" width="17" valign="middle" style="display: none;" role="presentation">
<div id="remote-picker-1337-errorEl" class="x-form-error-msg x-form-invalid-icon" style="display:none" aria-live="polite" role="alert" data-errorqtip=""></div>
</td>
</tr>
</tbody>
</table>
<table id="remote-picker-1338" class="x-field x-table-plain x-form-item x-form-type-text x-field-default x-anchor-form-item" cellpadding="0" role="presentation" style="table-layout: fixed; width: 292px;">
<tbody>
<tr id="remote-picker-1338-inputRow" class="x-form-item-input-row" role="presentation">
<td id="remote-picker-1338-labelCell" class="x-field-label-cell" width="155" valign="top" halign="left" style="" role="presentation">
<label id="remote-picker-1338-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:150px;margin-right:5px;" for="remote-picker-1338-inputEl">Офис</label>
</td>
<td id="remote-picker-1338-bodyEl" class="x-form-item-body " colspan="2" role="presentation" style="width: 100%;">
<table id="remote-picker-1338-triggerWrap" class="x-form-trigger-wrap" cellspacing="0" cellpadding="0" role="presentation" style="width: 100%; table-layout: fixed;">
<tbody role="presentation">
<tr role="presentation">
<td id="remote-picker-1338-inputCell" class="x-form-trigger-input-cell" role="presentation" style="width: 100%;">
<div id="ext-gen2052" class="x-hide-display x-form-data-hidden" role="presentation"></div>
<input id="remote-picker-1338-inputEl" class="x-form-field x-form-text " type="text" name="officeId" autocomplete="off" role="combobox" style="width: 100%;">
</td>
<td id="ext-gen2050" class=" x-trigger-cell x-unselectable" valign="top" style="width:17px;" role="presentation">
<div id="ext-gen2048" class="x-trigger-index-0 x-form-trigger x-form-search-trigger x-form-trigger-first" role="presentation"></div>
</td>
<td id="ext-gen2051" class=" x-trigger-cell x-unselectable" valign="top" style="width:17px;" role="presentation">
<div id="ext-gen2049" class="x-trigger-index-1 x-form-trigger x-form-clear-trigger" role="presentation"></div>
</td>
</tr>
</tbody>
</table>
</td>
<td id="remote-picker-1338-sideErrorCell" width="17" valign="middle" style="display: none;" role="presentation">
<div id="remote-picker-1338-errorEl" class="x-form-error-msg x-form-invalid-icon" style="display:none" aria-live="polite" role="alert" data-errorqtip=""></div>
</td>
</tr>
</tbody>
</table>

  • 0

#8 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 мая 2015 - 09:13

Для "Группа продавцов"

(//*[@class = 'x-form-item-label x-unselectable x-form-item-label-left'])[1]

Можно еще так:

//*[contains(text(), 'Группа продавцов')]

И так

(//*[@class = 'x-form-item-input-row']//label)[1]

 

Для "Офис"

(//*[@class = 'x-form-item-label x-unselectable x-form-item-label-left'])[2]

Можно и так:

//*[contains(text(), 'Офис')]

И еще так

(//*[@class = 'x-form-item-input-row']//label)[2]


  • 0

#9 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 09:48

Нет, всё ж я не правильно понял...
Искомые поля другие:

<input id="textfield-1081-inputEl" class="x-form-field x-form-text" type="text" autocomplete="off" name="textfield-1081-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">

<input id="textfield-1083-inputEl" class="x-form-field x-form-text " type="text" autocomplete="off" name="textfield-1083-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">

<input id="textfield-1085-inputEl" class="x-form-field x-form-text " type="text" autocomplete="off" name="textfield-1085-inputEl" size="1" role="textbox" data-errorqtip="" style="width: 100%;">

 

id и name, соответственно, генерятся и не имеют статичных значений

 

P.S. А я-то думал, почему так всё просто :pardon:


  • 0

#10 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 мая 2015 - 09:56

будет тогда для этих инпутов так:

(//*[@class = 'x-form-field x-form-text'])[1]

(//*[@class = 'x-form-field x-form-text'])[2]

(//*[@class = 'x-form-field x-form-text'])[3]


  • 0

#11 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 12:42

Может кто сталкивался в такой ситуации с ExtJS? Коллеги посоветовали покопать в эту сторону...


  • 0

#12 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 29 мая 2015 - 13:03

Копать надо в сторону использования более сложных локаторов.

Не всегда всё будет по id или по имени.


  • 0

#13 homyak

homyak

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Алексей
  • Город:Домодедово


Отправлено 29 мая 2015 - 13:55

Копать надо в сторону использования более сложных локаторов.

Не всегда всё будет по id или по имени.

Я довольно часто пользуюсь xpath, чуть реже cssSelector, но в этом конкретном случае это не особо применимо

Или нужно как-то комбинировать?
Или можно как-то цепляться за динамические id?
А можно ли элементам присвоить собственные id?


  • 0

#14 roccco

roccco

    Новый участник

  • Members
  • Pip
  • 11 сообщений
  • ФИО:Вовченко Денис Юрьевич

Отправлено 02 июня 2015 - 06:51

 

Копать надо в сторону использования более сложных локаторов.

Не всегда всё будет по id или по имени.

Я довольно часто пользуюсь xpath, чуть реже cssSelector, но в этом конкретном случае это не особо применимо

Или нужно как-то комбинировать?
Или можно как-то цепляться за динамические id?
А можно ли элементам присвоить собственные id?

 

Элементам можно присвоить собственные ID. Это делают либо программисты в самом коде программы, либо вы - если знаете где и как проставлять.
У меня проект написан с помощью GWT тоже id динамические. Я сам в коде проставлял id. Хотя можно и по xPath-у. Но по id надежней будет :)


  • 0

#15 bistra

bistra

    Новый участник

  • Members
  • Pip
  • 13 сообщений

Отправлено 02 июня 2015 - 09:38

Может кто сталкивался в такой ситуации с ExtJS? Коллеги посоветовали покопать в эту сторону...

У меня проект на Ext.Net написан, все ID динамические, к елементам обращаюсь примерно так:

 

*//input[substring(@id,string-length(@id)-28)='listMailActions_tfDescription']/../div[4]

*//table [substring(@id,string-length(@id)-6)='bCancel' and ancestor-or-self::div [substring(@id,string-length(@id)-7)='wDetails']]

*//table [substring(@id,string-length(@id)-6)='bDelete']

*//div[substring(@id,string-length(@id)-26)='pneNotes_dvPatientNotesView']/div[@class = 'comment-details']


  • 0

#16 aleksey_p

aleksey_p

    Активный участник

  • Members
  • PipPip
  • 107 сообщений
  • ФИО:Алексей

Отправлено 24 сентября 2018 - 08:03

Подскажите есть какие альтернативные способы автоматизации extjs? Пример кода, где id генерируется автоматом

<button type="button" id="ext-gen86" class=" x-btn-text modul" style="color: rgb(51, 51, 51);">Текст<br>текст</button>

  • 0

#17 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 24 сентября 2018 - 18:56

а нельзя ли вытащить id из @for аттрибута

ярлыка

<label id="textfield-1081-labelEl" class="x-form-item-label x-unselectable x-form-item-label-left" unselectable="on" style="width:100px;margin-right:5px;" for="textfield-1081-inputEl">Код</label>

и продолжать искать по id ?

 


  • 0

#18 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 24 сентября 2018 - 21:30

как нибудь так

String text = "Группа продавцов";

 

 

elements =

 

driver.findElements(

By.xpath(String.format("//label[contains(text(), '%s')]", text)));
assertTrue(elements.size() > 0);
WebElement element = elements.get(0);
 
String forId = element.getAttribute("for");
System.err.println("Label for id: " + forId);
// Act
try {
WebElement inputElement = driver.findElement(By.id(forId));
// Assert
assertThat(inputElement, notNullValue());
assertThat(inputElement.getAttribute("name"), equalTo("saleGroupId"));
 
// catch blocks...

  • 0

#19 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 25 сентября 2018 - 08:11

 

как нибудь так

String text = "Группа продавцов";

 

 

elements =

 

driver.findElements(

By.xpath(String.format("//label[contains(text(), '%s')]", text)));
assertTrue(elements.size() > 0);
WebElement element = elements.get(0);
 
String forId = element.getAttribute("for");
System.err.println("Label for id: " + forId);
// Act
try {
WebElement inputElement = driver.findElement(By.id(forId));
// Assert
assertThat(inputElement, notNullValue());
assertThat(inputElement.getAttribute("name"), equalTo("saleGroupId"));
 
// catch blocks...

 

У нас как правило id/name/class есть только у каких-то ключевых элементов:

 

- важные input поля

- таблицы (у самой таблицы, но не у строк/колонок)

- список (опять же сам список, а не id для каждого элемента списка)

- дерево

 

и т.д.

 

Далее применяется компонентный подход. По сравнительно простому локатору находится корневой элемент, а уже потом внутри него по менее удобным локаторам ищется требуемый вложенный элемент. Локатор может быть по тексту/классу/тэгу. А может потребоваться и вообще перебор (хотя это исключительная ситуация)

 

А уникальные и статичные id/name для каждого элемента - это какой-то идеальный мир.

 

Но конкретно в вашем случае не хватает вот этих вменяемых якорей для компонентов высокого уровня. Без них - это громоздкие и ненадежные xpath, что не есть гут. Обычно на такой минимальный набор разработчики легко соглашаются повесить вменяемые атрибуты имени, айди или класса.


  • 0

#20 Noksa

Noksa

    Активный участник

  • Members
  • PipPip
  • 117 сообщений
  • ФИО:Александр

Отправлено 25 сентября 2018 - 10:42

Уникальные id/name это не идеальный мир, это правильный процесс разработки.
Не у всех конечно, но у важных по просьбе всегда должны делать.
А ещё лучше если есть доступ к исходникам. При правильном подходе он должен быть.
  • 1



Темы с аналогичным тегами selenuim, java, динамические id

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных