Может ли кто-нибудь помочь мне, ответив на разницу между @By
и @Findby
при использовании Selenium через объектную модель страницы.
Разница между @By и @FindBy в POM с использованием Selenium
Ответы (4)
@FindBy использует шаблон проектирования фабрики страниц, By используется для поиска элементов (оба одинаковы, но ситуация с использованием отличается)
@FindBy(linkText ="REGISTER")
private WebElement register_menu_element;
После использования обоих способов я могу сказать, что основным преимуществом использования аннотаций является повышение удобочитаемости кода и сокращение усилий по обслуживанию!
PageFactory
в Selenium собирает все WebElement
, аннотированные аннотацией @FindBy
, @FindBys
или @FindAll
, и на основе значения аннотации строит объект By
, который содержит информацию о селекторе и его значении.
PageFactory
также поддерживает отложенное создание экземпляров. PageFactory
пытается найти элемент только тогда, когда вы пытаетесь с ним взаимодействовать.
Класс по
Class By()
— это механизм, который используется для поиска элементов в документе. Прямые известные подклассы:
- По.ByClassName
- По.ByCssSelector
- По.ById
- По.ПоСсылке
- По имени
- По.ByPartialLinkText
- По.ByTagName
- По.ByXPath
Вы всегда можете создать свои собственные стратегии поиска, используя подкласс класса, упомянутого ниже, и при необходимости переопределить защищенные методы, поскольку ожидается, что все подклассы полагаются на базовые механизмы поиска, предоставляемые через статические методы следующего класса:
public WebElement findElement(WebDriver driver) {
WebElement element = driver.findElement(By.id(getSelector()));
if (element == null) {
element = driver.findElement(By.name(getSelector());
return element;
}
}
Тип аннотации FindBy
С другой стороны, тип аннотации FindBy()
используется для обозначения поля в Page Object для указания альтернативного механизма поиска элемента или списка элементов. FindBy()
используется в в сочетании с PageFactory, который позволяет пользователям чтобы быстро и легко создать >Объекты страницы. Вы можете использовать эту аннотацию, указав как how
, так и using
, либо указав одну из стратегий определения местоположения (например, id
) с соответствующим значением для использования. Оба варианта будут делегированы соответствующим методам By в По классу.
Например, эти две аннотации указывают на один и тот же элемент:
@FindBy(id = "foo") WebElement foo;
@FindBy(how = How.ID, using = "foo") WebElement foo;
Вы можете найти комментарии @Simon Stewart по той же теме в обсуждении Как использовать явное ожидания с полями PageFactory и шаблоном PageObject
использованная литература
Вы можете найти пару соответствующих подробных обсуждений в: