t.me/atinfo_chat Telegram группа по автоматизации тестирования

Page object работа с нестандартными обьектами


(Vol) #1

Всем привет,

Пересмотрев видео от Поляруша Михаила, перевел несколько страниц на PageObject используя PageFactory в интерфейсе, который инициализирует элементы в класе.

Возник вопрос, как делать обвертки к динамичным обьектам?

 

Хочу привести несколько сценариев, которые я успешно использую у себя в проэкте:

1. Стандартная веб страница с кучкой TextField, Buttons - которые отображаются на странице всегда, количество обьектов не меняется. - Смело использую PageFactory в интерфейсе.

2. После ввода в TextField, страница обновляется - использую инициальзацию всех обьектов перед работой с обьектом (чтобы избежать StaleElementException), важно иметь "Getters and Setters" для каждого WebElement

3. Динамические локаторы для обьектов, количество которых меняется в зависимости от настроек выбраных в предыдущих меню - делаю изменения xpath в интерфейсе, таким образом ищу каждый элемент вручную через element = driver.FindElement(...)

или заганяю все найденые TextField в List<WebElement>, похже обрабатываю каждый элемент через цыкл For, если элементы очень сложные - вывожу их в отдельный класс,  далее уже дергаю по необходимости.

 

Пункт 3 меня наводит на подозрения что я делаю что-то не так, посколько ручной работы в таком варианте прибавляеться в разы. 

Посоветуйте, как делаете обвертки к элементам Вы? Возможно уже есть разработаный воркэраунд для таких ситуаций?

 


(Mykhailo Poliarush) #2

правильно ли я понимаю, ты спрашиваешь, что-то на подобии этого

@FindBy(css="td[class*='colName']:nth("+number+")") 
WebElement row; 

?

Если, да то тут конечно надо будет делать свою фабрику или переопределять DefaultElementLocatorFactory


(Petri4el) #3

А можно детальнее? Я новичок в селениуме и столкнулся с проблемой StaleElementException.
К примеру, меня имеется список элементов:

List<IWebElement> list = new List<IWebElement>(FindElements(locator));

затем я хочу, грубо говоря, прокликать по каждому элементу списка:

foreach (IWebElement location in list)
            {
                location.Click();
             }

Но клика не происходит, выкидывает StaleElementException.
Что можете посоветовать?


(Дмитрий Жарий) #4

StaleElementException происходит, когда элемент не видим или изменен.

Возможно, его нужно подождать при помощи WebDriverWait, а потом кликнуть. А вообще-то, все очень сильно зависит от страницы. JavaScript, например, может апдейтить страницу и видоизменять DOM, в то время, как Selenium пытается кликнуть на элементе.

Выхода тут два: первый – подождать появления элемента и проверить что он Displayed.
Второй – сделать клик через внедрение JavaScript кода