2015-08-25 2 views
2

У меня есть объектная модель страницы 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))); 
    } 

    // ... 
} 

В чем причина этой ошибки? Что я могу сделать с этим?

+0

Перед тем, как использовать DOM, вы должны «восстановить» (найти еще раз) элемент 'Language', поскольку элемент был изначально найден. См. Больше: http://stackoverflow.com/questions/16166261/selenium-webdriver-stale-element-reference-exception. – alecxe

+0

Я знаю, что это старый вопрос, но все же это интересно ... Какая строка точно выбрасывает исключение? Можете ли вы поделиться конструктором HomePage? возможно, вы как-то исправили его? – Moshisho

ответ

0

Из документов, Stale Element Reference Exception

A stale element reference exception is thrown in one of two cases, the first being more common than the second: 
- The element has been deleted entirely. 
- The element is no longer attached to the DOM. 

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


EDIT 1

Вот некоторые примеры кода, чтобы показать, как вы можете получить элемент, используя метод, даже при использовании PageFactory.

+0

Я использую 'PageFactory'. Я не мог повторно извлекать элементы вручную, если захочу. – MartinRosenberg

+0

Уверен, что вы можете ... вам просто нужно создать метод для извлечения каждого элемента Ajax. – JeffC

+0

Как я могу это сделать в 'PageFactory'? – MartinRosenberg