0

동적으로 생성 된 로케이터는 목록에서 어떤 요소가 선택 될지에 따라 달라집니다.와일드 카드를 사용하는 Pagefactory 동적 webelement

Function:TableName:0:submenuAction 

0 첫번째 요소리스트로부터 선택되는 의미 카운터이다

는 예를 들어,이 내 생성 된 ID이다. 카운터 앞뒤의 모든 문자열은 변경되지 않으므로 xpath 메소드가 포함되어 시작됩니다.

Function:TableName:{X}:submenuAction와 같은 와일드 카드를 사용할 수 있습니까? {x}는 정수입니다.

선택한 요소 수를 저장할 수 있지만이 변수는 pagefactory 요소 내부에서 어떻게 사용할 수 있습니까? driver.findelement는 staleElementException과 함께 실패 할 수 있습니다. 왜 제가 PageFactory를 사용하고 싶습니다.

+0

페이지의 DOM 상태를 변경 한 후 요소에 액세스하려고하면 일반적으로 부실 요소 오류가 발생합니다. 그래서 어떤 요소라도 사용하고 싶다면 참조를 즉시 얻어야하며, 그런 다음 어떤 동작을 수행 할 수 있습니다. 부적절한 요소 오류를 일으키는 몇 가지 의사를 쓰는 시나리오를 더 잘 이해할 수 있습니다. 1. 페이지의 모든 요소에 대한 참조를 얻으십시오 (driver.findelement (....)) 2. 새로 고침 페이지 (driver.manage.navigate.refresh()) 3. 지금 해당 요소를 클릭하십시오. element.click()) -> 부실 요소 오류가 발생합니다. –

답변

2

당신이 전달하는 것은 무엇이든 PageFactory 주석에 사용할 상수 (예 : final static : Java) 여야합니다.

:

주석에 언급 된 오래된 검사 전략의 일부뿐만 아니라
private final static int ITEM_INDEX = 2; 

... 

@FindBy(xpath="Function:TableName:"+ ITEM_INDEX + ":submenuAction") 
private WebElement targetListItem; 

, 당신은 또한 콜렉션 (예 : List<WebElement>)에 그 동적으로 확인 된 모든 요소를 ​​결합 시도 할 수 있습니다, 다음에 색인

@FindBy(xpath="...") 
private List<WebElement> allListEntries; 

... 

private WebElement getTargetListEntry(int index) { 
    return allListEntries.get(index); 
} 
+0

문제는 일정해야한다는 것입니다. for 루프 바로 뒤에 인덱스 값을 알지 못합니다. 내가 아는 한 상수는 이와 같이 수정하거나 초기화 할 수 없습니다. 어떤 생각? – brobee

+0

아, 네. 원하는 색인을 동적으로 계산하면 두 번째 예 (동적 목록의 모든 항목을 가져 와서 색인 생성)는 아마도 수행해야 할 작업 일 것입니다. –

관련 문제