2015-03-17 2 views
2
protected SelectElement GetSelectElement(By selector) 
    { 
     new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(c => 
     { 
      try 
      { 
       new SelectElement(driver.FindElement(selector)); 
       return true; 
      } 
      catch (StaleElementReferenceException) 
      { 
       return false; 
      } 
     }); 

     return new SelectElement(driver.FindElement(selector)); 
    } 

Даже с этой функцией я все еще получаю устаревший элемент на обратной линии, не уверен, что еще нужно сделать, чтобы избежать устаревших элементов.selenium stale element C#

+0

Действительно ли элементы присутствуют и не изменились? Причина, по которой вы получаете исключение устаревшего элемента, заключается в том, что DOM изменился без вашего WebDriver, зная об этом. –

ответ

1

Похоже, вы делаете проверку boolean, но не используете ее при возврате SelectElement. В результате return new SelectElement(driver.FindElement(selector)); выбрасывает StaleElementException, не заботясь о том, что вы делали ранее.

protected SelectElement GetSelectElement(By selector) 
{ 
    bool flag = new WebDriverWait(Driver, TimeSpan.FromSeconds(30)).Until(c => 
    { 
     try 
     { 
      new SelectElement(Driver.FindElement(selector)); 
      return true; 
     } 
     catch (StaleElementReferenceException) 
     { 
      return false; 
     } 
    }); 

    if (flag) 
    { 
     return new SelectElement(Driver.FindElement(selector)); 

    } 
    else 
    { 
     //something 
    } 

    return null; 
} 
+0

Конкретно для кода вопроса, поэтому мне пришлось немного настроить его, чтобы он работал в моей программе, но это хороший пример. –