У меня похожаю ошибка, но выскакивает она как-то рандомно только в двух тестах и в основном в фаерфоксе. Локально у меня всегда проходит,а валится на серваке. Не знаю как ее отловить.
Кликаю не так как вы говорили, а сначала нахожу элемент,а потом уже кликаю. Иногда проходит иногда нет.
Также случается:
Для FireFox:
OpenQA.Selenium.StaleElementReferenceException : Element not found in the cache - perhaps the page has changed since it was looked up
Для Internet Explorer:
OpenQA.Selenium.StaleElementReferenceException : Element is no longer valid
Чтобы проблемные элементы оставалися актуальными, стал перед обращением к ним получать информацию о них, в частности атрибуты. Указанных выше исключений не стало.
Для этого использую метод расширения Info() для IWebElement (он так-то для получения информации об элементе, для записи в лог, но он получает атрибуты элемента, тем самым не давая браузеру викинуть элемент из кеша):
//C# для Selenium.Webdriver.dotNet40
public static class WebElementExtension
{
public static string Info(this IWebElement element)
{
string info = "{";
try { info += String.Format("Type: {0}; ", element.GetType().Name); } catch (Exception) { };
try { info += String.Format("Tag: {0}; ", element.TagName); } catch (Exception) { };
try { info += String.Format("class: {0}; ", element.GetAttribute("class")); } catch (Exception) { };
try { info += String.Format("id: {0}; ", element.GetAttribute("id")); } catch (Exception) { };
try { info += String.Format("Text: {0}; ", element.Text); } catch (Exception) { };
try { info += String.Format("Displayed: {0}; ", element.Displayed); } catch (Exception) { };
try { info += String.Format("Location: {0}:{1}; ", element.Location.X, element.Location.Y); } catch (Exception) { };
try { info += String.Format("Size: {0}x{1}; ", element.Size.Width, element.Size.Height); } catch (Exception) { };
info += "}";
return info;
}
}
Таким образом, если раньше некий код приводил к исключениям, связанных с кешированием, (код вида):
btnClose.Click();
То обращение к атрибутам элемента перед кликом по нему, решает проблему, инициализирцет элемент, перед кликом по нему:
btnClose.Info();
btnClose.Click();