Selenium FindBy 사용하기

@FindBy는 Selenium에서 페이지 객체(Page Object)에 있는 WebElement 또는 WebElements 목록에 대한 객체의 위치 전략을 지정하는데에 사용됩니다.

이러한 WebElements는 PageFactory를 사용하여 페이지 객체가 만들어질 때 초기화 됩니다. @FindBy 어노테이션을 사용하여 WebElements (그룹)을 효율적으로 찾을 수 있는 방법을 알아보겠습니다.

@FindBy

@FindBy 어노테이션은 단일 기준을 사용하여 하나 이상의 WebElement 위치를 찾는데 사용합니다.

예를들어, 동일한 클래스 속성을 갖는 모든 element를 식별하려면 다음과 같이 사용할 수 있습니다.

@FindBy(className = "className")
private List<WebElement> elements;

그리고, element의 id를 사용할 때와 같이 위치 전략에 의해 식별되는 element가 하나 뿐인 경우에는 결과를 WebElement 변수에 직접 지정할 수도 있습니다.

@FindBy(id = "elementId")
private WebElement element;

element를 인스턴스화하기 위해 PageFactory 클래스의 initElements 메소드를 호출하면 됩니다.

PageFactory.initElements(driver, this);

@FindBys@FindAll

element에 고유한 id가 없는 경우처럼, 하나 이상의 개체를 식별하기 위해 두개 이상의 기준을 사용해야할 필요가 있습니다. 이런 경우 사용 가능한 방법은 아래와 같습니다.

  • @FindBys : element가 주어진 모든 조건과 일치해야 하는 경우 사용
  • @FindAll : element가 주어진 기준 중 적어도 하나와 일치해야하는 경우 사용

로그인 페이지의 아이디와 패스워드 두개의 입력 항목이 있는고, 두 element 모두 페이지객체 내에서 element를 식별하는데 사용할 ‘name’ 속성이 있다고 가정해봅시다.

@FindBys 사용

@FindBys({
   @FindBy(name = "Mngr_Id"),
   @FindBy(name = "Mngr_Pwd")
})
private List<WebElement> elements; // elements.size() == 0

element 에는 Mngr_Id 값이 있는 name 속성과 Mngr_Pwd 값이 있는 name 속성을 모두 가진 element가 없으므로 포함된 element가 0개 입니다.

@FindAll 사용

@FindAll({
   @FindBy(name = "Mngr_Id"),
   @FindBy(name = "Mngr_Pwd")
})
private List<WebElement> elements; // elements.size() == 2

element에는 두개의 element가 있어야 합니다. 하나의 element에는 Mngr_Id 값이 있는 name 속성이 있고, Mngr_Pwd 값이 있는 name 속성을 가진 element가 2개 있습니다.

마지막으로 페이지 객체 내에 많은 element가 있다면 @FindBy 전략을 지정하는 좀 더 자세한 방법을 사용수도 있습니다. 예를들어

@FindBy(className = "className")

@FindBy(how = How.CLASS_NAME, using = "className")

은 같은 결과를 보여줍니다.

댓글남기기