Div Xpaths меняется после каждой новой сборки - PullRequest
0 голосов
/ 03 февраля 2020

В настоящее время я выполняю автоматическое тестирование веб-приложения с использованием селена java. Для поиска элементов Iam с использованием относительных путей xpath. Я сталкиваюсь с проблемой регулярно, когда я получаю новую сборку, мои значения div xpath меняются. Пример:

Сборка 1:

//*[@id='container']/div/div/div/div/div[5]/div/ul/li[1]/div/ul/li[13]/button

Сборка 2:

//*[@id='container']/div/div/div/div/div[6]/div/ul/li[1]/div/ul/li[13]/button

Как мы можем заставить этот xpath работать для каждой сборки? Даже мы используем этот xpath для циклов for.

for (int i = 1; i <= 4; i++) {
    com.click("xpath","/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]/li["+ i + "]/div[1]/span[2]/div[1]");         
}

Есть ли какое-либо решение для преодоления этой проблемы?

HTML Код:

<div id="container" xpath="1"><div><div class="ice-theme-provider light-theme css-aw120u e9snama0" data-automation-active-theme-name="light"><div tabindex="-1"><div class="css-1enaoom" data-automation-id="console" data-console-id="0" role="presentation"><div data-automation-id="application-menu-bar" class="css-1f2kwet"><ul class="css-qq4041" data-automation-id="system-menu"><li class="css-1tx6twl"><button type="button" class="ice-button css-5nd6tx e66scw10">File</button></li><li class="css-1tx6twl"><button type="button" class="ice-button css-5nd6tx e66scw10">Preferences</button></li><li class="css-1tx6twl"><button type="button" class="ice-button css-5nd6tx e66scw10">Connect Utils</button></li><li class="css-1tx6twl"><button type="button" class="ice-button css-5nd6tx e66scw10">Help</button></li></ul><span class="css-132uuf9"></span><button title="Tab Sorting: Manual (unsorted)" type="button" class="ice-button css-151om0c e66scw10">MANUAL</button><button title="click to unlock the layout"

<button aria-disabled="false" role="menuitem" tabindex="-1" type="button" class="ice-button e12espz23 css-1gkebzc e66scw10" style="" xpath="1"><span>Mark Field<span width="square" class="ice-icon ice-icon-caret-right css-19ah4i1 e5j0fb80"><svg viewBox="576 0 576 1792"><path d="M1152 896q0 26-19 45l-448 448q-19 19-45 19t-45-19-19-45v-896q0-26 19-45t45-19 45 19l448 448q19 19 19 45z"></path></svg></span></span></button>

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Выражение XPath с типом данных number внутри предиката является просто сокращенной формой для сравнения с функцией position().

Вы также можете использовать это выражение только для XPath:

/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]
  /div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]
      /li[position() <= 4]/div[1]/span[2]/div[1]
0 голосов
/ 04 февраля 2020

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

  • Я предпочитаю использовать параметр, который находится внутри тега, например
    идентификатор, имя, класс, заполнитель et c.
    ex: - xpath = "// input [@ name = 'email']"

  • Текст между тегом, такой как
    xpath = "// a [содержит (text (), 'Это пример')]"

Это решит большинство проблемы.

Попробуйте, это поможет вам.

Свяжитесь со мной, если у вас есть какие-либо сомнения.

0 голосов
/ 04 февраля 2020

используйте ниже.

for (int i = 1; i <= 4; i++) {
driver.findElement(By.xpath("//button[@title='click to unlock the layout']")).click();

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...