2016-07-26 4 views
0

Определим наши объекты страницы с @FindBy аннотацию, как:Как над StaleElementReferenceException при работе с PageFactory

@FindBy(name="foo") 
WebElement fooElement; 

Всякий раз, когда я вызываю этот объект fooElement, который должен попытаться определить с выше name=foo, верно?

Тогда почему я получу StaleElementReferenceException?

Как преодолеть это?

Я не хочу следовать другой подход снова здесь (кроме страницы завода) всякий раз, когда я вижу, как StaleElement:

WebElement fooElement=driver.findElement(By.name("foo")) 

Может кто-нибудь помочь мне в этом?

+1

Пожалуйста, опишите вашу enviorement, язык вы используете или рамки. –

ответ

-1

Исключение StaleElementReferenceException означает, что находящийся элемент больше не присутствует на странице. Он обычно добавляется, когда целевой элемент находится непосредственно перед изменением страницы и когда он используется сразу после. Вот пример, чтобы продемонстрировать проблему:

// trigger the update of the page 
driver.findElement(By.name("foo1")).click(); 

// at this step the page is not yet updated, so the located element is not from the updated page. 
WebElement element = driver.findElement(By.name("foo2")); 

// at this step, the page is updated, the element is now deleted 
element.click(); // throws `StaleElementReferenceException` 

Чтобы преодолеть эту проблему, вы можете ждать предыдущего элемента устаревают:

fooElement1.click(); 

new WebDriverWait(driver, 10) 
    .until(ExpectedConditions.stalenessOf(fooElement1)); 

fooElement2.click(); 

Вы также можете ждать нового элемента, чтобы стать видимым :

new WebDriverWait(driver, 10) 
    .until(ExpectedConditions.visibilityOf(fooElement3)); 

fooElement2.click(); 

Суть заключается в том, что вам нужно ждать определенного государства, которое, вероятно, является результатом асинхронного обновления.

Обратите внимание, что простым способом было бы повторить попытку, чтобы снова найти элемент и дать новую ссылку. Но я бы не рекомендовал его, поскольку команда может быть выполнена перед обновлением:

try { 
    fooElement.click(); 
} catch (StaleElementReferenceException ex) { 
    fooElement.click(); 
} 
+0

«Исключение StaleElementReferenceException означает, что находящийся элемент больше не присутствует на странице« ... это не совсем точно. Исключение будет выбрано, если базовый узел DOM был каким-либо образом изменен (или его родитель). Элемент все еще может присутствовать, но его необходимо восстановить. Последним вариантом повторного поиска элемента после обнаружения исключения является, вероятно, лучший способ его обработки. –

+0

@ Аарон Дэвис, спасибо за вход, но я не согласен. Это исключение возникает только тогда, когда находящийся элемент больше не присутствует на странице (документ или DOM). Драйверы (по крайней мере, Firefox и Chrome) проверяют, что элемент является потомком основного контейнера, который является объектом «document» в окне или кадре. Исключение не будет поднято до тех пор, пока элемент будет прикреплен к документу, даже если вы измените предка, потомка или переместите элемент. –

+0

hmmm, просто проверил документацию еще раз. В соответствии с этим исключение происходит, когда элемент удаляется или удаляется из DOM (например, этот элемент расположен, тогда библиотека JS удаляет базовый узел DOM и заменяет его другим, имеющим ту же информацию). http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp –

0

Его работа для меня ..

public static void StaleHandle(WebElement element) 
    { 
     for(int i=0; i<5;i++) 
     try 
     { 
      // whatever actions performed by the element. 
      break; 
     } 
     catch(StaleElementReferenceException e) 
     { 

      System.out.println("Trying to recover from a stale element :" + e.getMessage()); 

     } 

    } 
Смежные вопросы