«Идентификатор» элемента изменяется (не статично) на некоторых веб-страницах при проверке элементов во время автоматизации тестирования с использованием Selenium.Как справиться с этой ситуацией? - PullRequest
2 голосов
/ 23 апреля 2019

Я пытаюсь захватить поле раскрывающегося меню, используя автоматизацию тестирования в SELENIUM с драйвером Chrome.

Почему элемент "id" изменяется на некоторых веб-страницах при периодической проверке элементов в браузере Chrome?Как сохранить "id" в неизменном состоянии?

Шаги, за которыми я следовал:

  1. Когда я проверяю элементы на веб-странице, конкретное раскрывающееся меню показывает свой «id» в виде: id= "combo-1782-inputEl"

HTML:

<input id="combo-1782-inputEl**" type="text" class="x-form-field x-form-required-field x-form-text x-trigger-noedit x-form-focus x-field-form-focus x-field-default-form-focus" autocomplete="off" name="type" readonly="readonly" aria-invalid="false" data-errorqtip="" style="width: 135px;">

id, наблюдаемый при проверке веб-страницы в обычном браузере Chrome:

-

Затем я использовал вышеуказанный идентификатор в своем коде Java (скрипт автоматизации), как показано ниже:

driver.findElement (By.id ("combo-1782-inputEl")). Click ();

Когда я запускаю тест> Браузер Google Chrome открывается автоматически> Тест проходит успешно, пока не встретит вышеуказанную строку кода.

Но, когда он встречает вышеприведенную строку кода, тест завершился неудачно. Было выдано следующее исключение:

  • class org.openqa.selenium.NoSuchElementException *

Затем я проверил тот же самый элемент выпадающего меню на веб-странице Chrome, который открывается (управляется) с помощью программного обеспечения для автоматического тестирования, и обнаружил, что «id» отличаетсячем предыдущий идентификатор, упомянутый в шаге 1. «Идентификатор» в этом случае: « combo-1781-inputEl »

id, наблюдаемый при проверкевеб-страница в браузере Chrome, управляемая автоматизированным программным обеспечением:

-

Как видите, число в середине идентификатора уменьшилось с 1. (1782-1 = 1781)

Та же проблема была обнаружена в других пунктах выпадающего меню на той же веб-странице.

В чем причина этой проблемы?Как я могу преодолеть эту ситуацию?Пожалуйста помоги.:)

PS Когда я использовал «combo-1781-inputEl» («id» из шага 5) в моем коде, тест прошел успешно.

driver.findElement(By.id("combo-1782-inputEl")).click();  //Test: failed
driver.findElement(By.id("combo-1781-inputEl")).click();  //Test: passed

Я ожидал, что тест будет пройден, когда я использовал «id», полученный на шаге 1, проверяя веб-страницу в обычном браузере Chrome, который не контролируется автоматическим программным обеспечением.

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Чтобы предоставить вам наилучший ответ, мне нужно увидеть раздел HTML-кода для веб-страницы, достаточно, чтобы я мог видеть другие атрибуты.Если у вас есть динамические идентификаторы, у вас есть две опции:

Вариант 1: использовать xpath, который использует часть идентификатора, которая является постоянной, то есть:

//*[starts-with(@id, 'combo-')]

можетделать трюк, но только если нет других похожих идентификаторов.

Или, возможно:

//*[starts-with(@id, 'combo-') and ends-with(@id, '-inputEl')]

, но это может быть недостаточно конкретным.Вот почему просмотр части вашего HTML-кода может помочь.

Вариант 2: использовать другие атрибуты вместо идентификатора, то есть класс, текст или какой-либо другой атрибут.

//*[@name='FirstName']

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

0 голосов
/ 24 апреля 2019

Очевидно, что атрибут id тега <input> изменяется динамически, например, "combo-1782-inputEl" , "combo-1781-inputEl" и т. Д., Поэтому вам необходимо создать динамический локатор , вызывающий WebDriverWait и вы можете использовать любую из следующих Стратегий локатора :

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input.x-form-field.x-form-required-field.x-form-text.x-trigger-noedit.x-form-focus.x-field-form-focus.x-field-default-form-focus[id$='-inputEl'][name='type']"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@id, 'combo-') and @class='x-form-field x-form-required-field x-form-text x-trigger-noedit x-form-focus x-field-form-focus x-field-default-form-focus'][@name='type']"))).click();
    
0 голосов
/ 23 апреля 2019

Используйте Xpath и WebDriverWait для обработки динамического элемента. Надеюсь, это сработает.

WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@id, 'combo-')][@type='text']")));
...