Создает ли Selenium FindBy экземпляры WebElement в классе PageObject?

Действительно ли аннотация Selenium FindBy создает экземпляры WebElement, и если да, то каков смысл фреймворка, который их использует?

То, что я делал с объектами моей страницы, сейчас выглядит так. Все мои методы тестовой среды принимают в качестве аргументов локаторы (а не экземпляры WebElement).

//fields in the page
public static final By SEARCH_BOX = By.id("input-what");

Мой вопрос: создает ли FindBy экземпляры WebElement во время создания экземпляра класса? Если это так, то я подозреваю, что моим методам фреймворка потребуются экземпляры WebElement. Это правильно и что предпочтительнее в рамках: аргументами локатора или аргументами WebElement?

@FindBy(id = "input-what")
public WebElement SEARCH_BOX_ELEMENT;

Я знаю, что жду несколько самоуверенного ответа. Если вы дадите мне ссылку на вашу веру, то я думаю, что это будет разумный ответ. Я думаю, это имеет далеко идущие последствия: например, методы в Selenide framework, не принимают экземпляры WebElement в свои аргументы, и поэтому объекты PageObject, использующие аннотации FindBy, не смогут передавать эти элементы в методы Selenide?


person djangofan    schedule 18.02.2016    source источник


Ответы (2)


Если я понимаю, о чем вы спрашиваете, ваш ответ находится в самой первой строке документации. :

Чтобы использовать PageFactory, сначала объявите некоторые поля в PageObject, которые являются WebElements или _2 _...

Или, возможно, конец той же документации:

WebElements оцениваются лениво. То есть, если вы никогда не используете поле WebElement в PageObject, для него никогда не будет вызова findElement.

Изменить. Чтобы ответить на этот вопрос: PageObject - это стиль кодирования сбора информации о вашем веб-приложении. Чтобы сделать этот стиль кодирования менее подробным, Selenium предлагает PageFactory, в котором используется @FindBy аннотация для украшения WebElements в ваших классах PageObject.

person SiKing    schedule 18.02.2016
comment
Извините, мой вопрос выходит за рамки использования PageFactory. Другими словами, мой вопрос задается в контексте, когда PageObject никогда не вызывает PageFactory. - person djangofan; 18.02.2016
comment
@djangofan @FindBy используется только в PageFactory. Использование ваших собственных PageObjects приведет к игнорированию аннотации. - person SiKing; 18.02.2016
comment
Ах. Это отвечает на часть моего вопроса. Любая ссылка на то, где это задокументировано? - person djangofan; 18.02.2016
comment
Да, но я думал в том же духе, что и SiKing ... если вы передадите свой класс PageFactory для создания экземпляра WebElements для вас, то разве они по определению не были созданы раньше? По крайней мере, это было то, к чему мой ответ был направлен ... :) - person JeffC; 18.02.2016
comment
Это задокументировано в FindBy. ... ...Used in conjunction with PageFactory this... - person JeffC; 18.02.2016
comment
Хорошо, я прочитал документ: так загружаются они или нет WebElements лениво, без вызова PageFactory, но при первой ссылке на объект WebElement? Док не совсем ясен в этом. - person djangofan; 18.02.2016
comment
@djangofan Без использования PageFactory аннотации @FindBy игнорируются, и вы не получаете ничего. - person SiKing; 18.02.2016
comment
Хорошо спасибо. Итак, я сохраню свой текущий метод, который позволяет мне не предварительно загружать элементы, а вместо этого находить их по запросу. Спасибо. - person djangofan; 18.02.2016
comment
@djangofan Ваше изменение моего ответа неверно. Снова из документации: каждый раз, когда мы вызываем метод в WebElement, драйвер будет искать его на текущей странице снова (выделено мной). Пожалуйста, отмените редактирование! - person SiKing; 18.02.2016
comment
В порядке. Я буду. Такое впечатление у меня сложилось из документации. Прости. Если это так, то кажется, что использование PageFactory с FindBy - лучший метод по сравнению с тем, как я это делал. - person djangofan; 18.02.2016
comment
@djangofan Это лучше всего, что у вас есть. Если вы думаете, что у вас есть что-то получше, я бы посоветовал вам включить это в официальный код Selenium. - person SiKing; 18.02.2016

Я не знал об этих новых аннотациях в селене.

Видно, что шаблон объекта страницы реализован с помощью фреймворков на основе Stand Alone Weld.

В любом случае, я думаю, это относительно ясно: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/FindBy.html.

Используется вместе с PageFactory, это позволяет пользователям быстро и легко создавать PageObjects.

Если вы попросите фабрику вернуть вам объект страницы, она будет внедрять объект страницы с веб-элементами, которые читаются в этот момент времени. Если ваша страница имеет что-то вроде функции кометы и со временем устареет, вам не следует ожидать, что ваши внедренные веб-элементы станут устаревшими.

Из того, что я видел до сих пор, вы хотите, чтобы объекты страницы упростили ваше взаимодействие с содержимым браузера. Но вы хотите, чтобы они не имели гражданства.

Как правило, я бы предпочел, чтобы страницы с поддержкой ajax никогда не имели состояния на объектах моей страницы.

Если хотел написать в текстовое поле. Я бы предложил api:

public void writePassword(String password){
    ... callPrivateGetterToGetPasswordField().writeText(password);
}

И так далее. Я бы продвигал методы, которые используют короткую серию чтения содержимого dom и записывают содержимое dom, и старались бы, чтобы объекты страницы не собирали устаревший контент.

person 99Sono    schedule 18.02.2016
comment
Да, это отвечает на другую часть моего вопроса. Спасибо за разъяснения. - person djangofan; 18.02.2016