2017-02-03 8 views
0

У меня есть следующий метод, используемый, чтобы нажать несколько выпадающие на странице:Почему StaleElementReferenceException выбрасывается следующим методом?

protected void selectIthElementOffAllDropDowns(String selectElement, int entryOfDropdown) { 

    ICollection<IWebElement> allElements = driver.FindElements(By.CssSelector(selectElement)); 

    foreach(IWebElement element in allElements) { 
     if(element.IsDisplayed) { 
      new SelectElement(element).SelectByIndex(entryOfDropdown); 
     } 
    } 
} 

Около 70% времени код выполняется, как ожидалось. Однако он иногда выбрасывает StaleElementReferenceException. Когда это будет брошено кидаем на линии:

new SelectElement(element).SelectByIndex(entryOfDropdown); 

То, что я не понимаю, как element.IsDisplayed верно, но в соответствии с документацией Селен here Эта ошибка возникает, когда элемент был удален полностью или когда элемент больше не привязан к DOM. Кто-нибудь сможет объяснить, как эта ошибка была выбрана? Кроме того, почему условие в выражении if было истинным, если эта ошибка была выбрана правильно?

Примечание: Я использую chromedriver запустить эти тесты с OpenQA.Selenium

ответ

0

Это обычно происходит, когда страница перезагружается между найти элемент и делает действие на него.

Обязательно убедитесь, что элемент находится перед выполнением каких-либо действий.

В этом случае вы используете foreach для выполнения некоторых действий со списком/массивом/коллекцией объектов, если в любой момент страницы загружается, то эти объекты теряются, они не видны как прикрепленные к странице.

Проблема заключается в том, что страница изменяет состояние или перезагружается после того, как вы нашли объект => у вас есть объект, который не прикреплен к странице, и вы не можете его использовать. если у вас есть несколько объектов, и вы зацикливаете их на них, вероятность появления устаревшего элемента будет иметь более высокую скорость.

Я не знаю, насколько правилен следующий пример: предположим, что у вас есть объект страницы/экземпляр страницы, вы просматриваете какой-то элемент, и у вас есть объект (ы) элемента, страница перезагружается => экземпляр потерян, а новый создан, теперь у вас есть некоторые объекты, которые не регистрируются на объекте страницы, они не привязаны к этой странице, аналогичные элементы есть, но не ваши объекты, вам придется найти и создавать новые объекты для ваших элементов.

Он может быть изменен в любое время, в том числе после оценки состояния if и ввода в if.