Пересмотрев видео от Поляруша Михаила, перевел несколько страниц на PageObject используя PageFactory в интерфейсе, который инициализирует элементы в класе.
Возник вопрос, как делать обвертки к динамичным обьектам?
Хочу привести несколько сценариев, которые я успешно использую у себя в проэкте:
1. Стандартная веб страница с кучкой TextField, Buttons - которые отображаются на странице всегда, количество обьектов не меняется. - Смело использую PageFactory в интерфейсе.
2. После ввода в TextField, страница обновляется - использую инициальзацию всех обьектов перед работой с обьектом (чтобы избежать StaleElementException), важно иметь "Getters and Setters" для каждого WebElement
3. Динамические локаторы для обьектов, количество которых меняется в зависимости от настроек выбраных в предыдущих меню - делаю изменения xpath в интерфейсе, таким образом ищу каждый элемент вручную через element = driver.FindElement(...)
или заганяю все найденые TextField в List<WebElement>, похже обрабатываю каждый элемент через цыкл For, если элементы очень сложные - вывожу их в отдельный класс, далее уже дергаю по необходимости.
Пункт 3 меня наводит на подозрения что я делаю что-то не так, посколько ручной работы в таком варианте прибавляеться в разы.
Посоветуйте, как делаете обвертки к элементам Вы? Возможно уже есть разработаный воркэраунд для таких ситуаций?
StaleElementException происходит, когда элемент не видим или изменен.
Возможно, его нужно подождать при помощи WebDriverWait, а потом кликнуть. А вообще-то, все очень сильно зависит от страницы. JavaScript, например, может апдейтить страницу и видоизменять DOM, в то время, как Selenium пытается кликнуть на элементе.
Выхода тут два: первый – подождать появления элемента и проверить что он Displayed.
Второй – сделать клик через внедрение JavaScript кода