Разница между @By и @FindBy в POM с использованием Selenium

Может ли кто-нибудь помочь мне, ответив на разницу между @By и @Findby при использовании Selenium через объектную модель страницы.


person Sudarshan    schedule 23.06.2020    source источник


Ответы (4)


@FindBy использует шаблон проектирования фабрики страниц, By используется для поиска элементов (оба одинаковы, но ситуация с использованием отличается)

@FindBy(linkText ="REGISTER")
private WebElement register_menu_element;
person Justin Lambert    schedule 23.06.2020

После использования обоих способов я могу сказать, что основным преимуществом использования аннотаций является повышение удобочитаемости кода и сокращение усилий по обслуживанию!

person Nirzaree    schedule 04.08.2021

PageFactory в Selenium собирает все WebElement, аннотированные аннотацией @FindBy, @FindBys или @FindAll, и на основе значения аннотации строит объект By, который содержит информацию о селекторе и его значении.

PageFactory также поддерживает отложенное создание экземпляров. PageFactory пытается найти элемент только тогда, когда вы пытаетесь с ним взаимодействовать.

person Fenio    schedule 23.06.2020

Класс по

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 в По классу.

Например, эти две аннотации указывают на один и тот же элемент:

  1. @FindBy(id = "foo") WebElement foo;
  2. @FindBy(how = How.ID, using = "foo") WebElement foo;

Вы можете найти комментарии @Simon Stewart по той же теме в обсуждении Как использовать явное ожидания с полями PageFactory и шаблоном PageObject


использованная литература

Вы можете найти пару соответствующих подробных обсуждений в:

person DebanjanB    schedule 23.06.2020