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")
은 같은 결과를 보여줍니다.
댓글남기기