2012-10-10 3 views
1

저는 listviews에 대한 Java Selenium 테스트를 작성하고 있습니다. 특히 셀 뷰는 listview에서 항목의 유효성을 확인한 다음 선택하는 것이 좋습니다.셀레늄 - 일관성없는 StaleElementReference 오류

테스트가 절반 만 제대로 실행되기 때문에 나에게 미쳐 가겠지 만 나머지 절반은 StaleElementReference 또는 비슷한 오류를 줄 때가 있습니다. 종종 매번 다른 단계에서 발생합니다. 동일한 조건에서 실행하는 경우입니다.

내가 수집 한대로 목록보기 페이지가 변경 될 때마다 WebElement 변수를 다시 할당하지만 여전히 문제가 발생할 수 있습니다. 그런 다음 페이지가 완전히로드 될 때까지 기다릴 필요가 있다고 생각했지만 일부 다른 사람들이 보았던 WebDriverWait 같은 것을 사용하는 방법을 완전히 알지 못했습니다. 나는 그러나 기존의 기본 페이지 객체 클래스가 이미 대기를 위해 무언가를 포함하는 것을 알고, 그래서 나는이 이미 적용 할 수있다 생각한다

public abstract class PageObject { 

protected WebDriver driver; 
protected WebDriverWait wait; 
    ... 
    public PageObject(WebDriver driver, String relativePath) { 
      ... 
      this.driver = driver; 
      this.wait = new WebDriverWait(driver, 8); 
      ... 

이 충분한, 아니면 내가 '대기'의보다 구체적인 형태가 필요합니까 이 문제는?

그 외에도 아무도이 문제를 일으킬 수있는 일반적인 문제를 생각할 수 있습니까?

고마워요.

답변

2

heh와 비슷한 문제가 있습니다. 당신은 페이지, 가장 좋은 방법은 (이럴) 그래서 당신은 실제로 웹 요소의 로케이터 (찾을 필요가 그것을 처리하고 내가 가장 좋아하는 대기가 fluentWait()

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(1, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
       new Function<WebDriver, WebElement>() { 
        public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
        } 
       } 
     ); 
     return foo;    
    }; 

입니다하기에 AJAX를 많이 가지고 때 문제입니다 xpath 또는 css 선택기)를 사용하고 유창한 대기 상태로 전달합니다. 유창한 대기는 웹 요소를 찾은 것을 반환합니다. 문서에서 : 즉시 대기 시간 및 폴링 간격을 구성 할 수있는 대기 인터페이스 구현입니다. 각 FluentWait 인스턴스는 조건을 검사 할 빈도뿐만 아니라 조건을 기다리는 데 걸리는 최대 시간을 정의합니다. 또한 사용자는 페이지에서 요소를 검색 할 때 NoSuchElementExceptions와 같이 대기 중에 특정 유형의 예외를 무시하도록 대기를 구성 할 수 있습니다. 사용 : 당신은 두 가지 유형 (내 경험에서) 문제의 같은 종류의 수 있습니다 원인이 거기에 here

문제를 더 많은 정보를 얻을 수 있습니다

String xPathElement =".....blablabla..."; 
WebElement neededElement =fluentWait(By.xpath(xPathElement)); 
neededElement.click(); 
//neededElement.getText().trim(); 

: 1) 첫 번째

페이지 렌더링을 유발하는 요소와 상호 작용하거나 '느리게'작동합니다. 셀레늄 테스트는 계속 진행되지만 실제로 페이지가 렌더링되지 않음 >>staleElement.

2) 두 번째. 하나의 요소와 상호 작용합니다. 다른 AJAX (완전한 페이지 재로드 및 첫 번째 요소 새로 고침이 아닌)를 발생시킵니다. 즉시 (예 : getText 또는 클릭) >>staleElement과 같은 이전 페이지로 돌아갑니다.

저는 항상 유창한 대기 시간을 사용합니다. 귀하가 중재 판정을 무시할 수있는 시점부터는 편안합니다. 희망이 있습니다.

+0

AJAX 렌더링시 임의의 StaleElementExceptions에 대한 첫 번째 이유는 +1입니다.그게 내 문제 였음을 확신했지만 누군가 그것을 확인하는 것이 좋다. – bsg