driver.findElement(By.xpath("//*[@id=\"__box23-arrow\"]")).click();dropdown
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
Thread.sleep(5000);
driver.findElement(By.xpath("//*[@id=\"__item1283-__box23-2\"]")).click();
Каждый раз, когда мой xpath изменяется //*[@id=\"__box23-arrow\ пример //*[@id=\"__box24-arrow\
, я делаю автоматизацию для SAP, Не могли бы вы дать какое-нибудь другое решение?
Если вы знаете начало вашего идентификатора, которое является статическим во всем, то в этом случае вы можете выбрать
"//*[@id*='__box']"
Это даст вам элемент(ы), чей id начинается с '__box'
Надеюсь, это поможет!
Вы можете написать динамический xpath, используя ключевое слово contains.
Смотрите пример ниже -
//a[contains(@id, 'ctl00_btnAircraftMapCell')
В соответствии с HTML, который вы нам предоставили, вы можете попробовать использовать этот xpath:
//span[@role='button' and contains(@class,'sapMComboBoxArrow sapMComboBoxBaseArrow sapMComboBoxTextFieldArrow')]
Если ваш xpath будет постоянно меняться, то для того, чтобы код Selenium работал, по крайней мере, должна быть какая-то закономерность в том, как он меняется, например, он может зависеть от текущей даты. Тогда вы сможете соответствующим образом сгенерировать xpath динамически при каждом запуске сценария. Если нет такой закономерности и статического содержимого, чтобы использовать contains
в xpath, вам стоит обратить внимание на другие инструменты, например Sikuli. Он использует распознавание изображений для идентификации элемента. Это опять же предполагает, что видимый аспект вашего элемента остается неизменным.
Также появилась волна новых продуктов для тестирования на основе искусственного интеллекта, таких как Testim, которые являются "самовосстанавливающимися", то есть они адаптируются к изменениям в исходном коде. Я их не использовал, но, возможно, это то, что вам нужно.