2013-04-19 4 views
1

Я использую selenium 2 и драйвер chrome и, похоже, не могу получить явное ожидание работы независимо от того, что я делаю. Я пытаюсь щелкнуть элемент, который динамически генерирует некоторые данные с помощью ajax (без перезагрузки), а затем искать элемент, когда он будет присутствовать на странице.selenium chrome driver явно не работает

Это мой код

 leagueNameItem.Click(); 

     IList<IWebElement> outerTables_forEachLeague = new List<IWebElement>(); 

     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
     outerTables_forEachLeague = wait.Until<IList<IWebElement>>((d) => 
     { 
      return d.FindElements(By.ClassName("boxVerde")); 
     }); 

Элемент не найден (и это на странице точно). Функция ожидания фактически не «ждет» в течение 10 секунд, поскольку указанный ut просто ничего не возвращает. Любые идеи PLS?

+0

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

+0

Я бы предположил, что, поскольку '.FindElements' возвращает пустой список, если он ничего не может найти, он просто возвращается. Что, если вы сделаете это '.FindElement', это вернет что-нибудь? – Arran

ответ

8

Проблема заключается в том, что FindElements немедленно возвращается и возвращает действительный пустой объект списка, если элементы не найдены. У вас есть два варианта. Вы можете использовать одиночный FindElement в ожидании, который генерирует исключение, если элемент не существует. Объект WebDriverWait поймает это исключение и повторит попытку, пока элемент не будет найден.

Однако, поскольку вы хотите вернуть список из своего ожидания, вам нужно быть немного более умным, что приведет к вашему второму варианту. Измените свое подобие, чтобы выглядеть примерно так:

leagueNameItem.Click(); 

IList<IWebElement> outerTables_forEachLeague = new List<IWebElement>(); 

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
outerTables_forEachLeague = wait.Until<IList<IWebElement>>((d) => 
{ 
    var elements = d.FindElements(By.ClassName("boxVerde")); 
    if (elements.Count == 0) 
    { 
     return null; 
    } 

    return elements; 
}); 
+0

спасибо, что сработал;) –

+0

Рад это слышать! Упоминать это как принятый ответ? – JimEvans

Смежные вопросы