У меня есть объектная модель страницы Selenium WebDriver в C# 6. Я испытываю StaleElementReferenceException
s, пытаясь щелкнуть элементы, базирующиеся на ajax-навигаторе. Это сбивает с толку, потому что я использую PageFactory
, без каких-либо [CacheLookup]
s.Как предотвратить StaleElementReferenceException в PageFactory в Selenium C#?
Вот код, о котором идет речь. Я попытался упростить только важные части. (Я фактически прохожу мимо Driver
, обертка вокруг IWebDriver
.) MenuBar.SelectEnglish<T>()
выдает исключение.
public class Tests
{
[Test]
public void SelectEnglishTest()
{
homePage
.MenuBar.SelectEnglish<HomePage>();
}
// ...
}
public class MenuBar : PageObject
{
[FindsBy(How = How.CssSelector, Using = "...")]
private IWebElement Language { get; set; }
[FindsBy(How = How.CssSelector, Using = "...")]
private IWebElement English { get; set; }
public T SelectEnglish<T>() where T : Page
{
Language.Click();
IWait<IWebDriver> wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
wait.Until(ExpectedConditions.ElementToBeClickable(English));
English.Click();
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
return (T)Activator.CreateInstance(typeof(T), Driver);
}
// ...
}
public class HomePage : PageObject
{
public MenuBar MenuBar { get; private set; }
// ...
}
public class PageObject
{
protected IWebDriver Driver { get; }
protected PageObject(IWebDriver driver)
{
Driver = driver;
PageFactory.InitElements(this, new RetryingElementLocator(Driver, TimeSpan.FromSeconds(20)));
}
// ...
}
В чем причина этой ошибки? Что я могу сделать с этим?
Перед тем, как использовать DOM, вы должны «восстановить» (найти еще раз) элемент 'Language', поскольку элемент был изначально найден. См. Больше: http://stackoverflow.com/questions/16166261/selenium-webdriver-stale-element-reference-exception. – alecxe
Я знаю, что это старый вопрос, но все же это интересно ... Какая строка точно выбрасывает исключение? Можете ли вы поделиться конструктором HomePage? возможно, вы как-то исправили его? – Moshisho