.NET Selenium NoSuchElementException; WebDriverWait.Until() не работает

У нас есть проект .NET 4.5, MVC, C#. Мы используем Selenium для тестов пользовательского интерфейса, и тесты периодически дают сбой в строках, которые у нас есть wait.Until(). Один из таких примеров:

NoSuchElementException was unhandled by user code
An exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in WebDriver.dll but was not handled in user code
Additional information: Unable to locate element: {"method":"css selector","selector":"#assessment-472 .status-PushedToSEAS"}

Это брошено прямо здесь:

Thread.Sleep(600);
wait.Until(drv => drv.FindElement(By.CssSelector("#" + assessmentQueueId + " .status-PushedToSEAS")));

Я вижу, что браузер открывается, я вижу, что он дошел до этой точки, и я могу проверить элемент, чтобы убедиться, что он существует. Его идентификатор точно правильный.

У нас есть эта проблема МНОГО, и до сих пор решение заключалось в том, чтобы поставить перед ней Thread.Sleep(600) (или какое-то подобное время). Весь смысл wait.Until() в том, чтобы этого не делать, и из-за этого наши наборы тестов становятся очень длинными. Кроме того, как вы можете видеть в приведенном выше примере, иногда у нас возникает проблема даже после того, как перед ней ставится Thread.Sleep(), и нам приходится увеличивать время.

Почему .NET Selenium WebDriver.Until() не работает, и есть ли другой способ сделать то же самое, не дожидаясь установленного периода времени? Опять же, проблема носит периодический характер, что означает, что она возникает только иногда и может произойти при любом количестве операторов wait.Until(), а не только в показанном!

Изменить:

Это переменная класса. private WebDriverWait wait;

Он создается следующим образом:

this.wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

person levininja    schedule 04.03.2015    source источник
comment
Как вы определяете wait? Спасибо.   -  person alecxe    schedule 04.03.2015
comment
@alecxe смотрите приведенное выше редактирование. Извините, что забыл упомянуть об этом.   -  person levininja    schedule 04.03.2015
comment
@alecxe Я делаю это ... см. редактирование еще раз; прости еще раз.   -  person levininja    schedule 05.03.2015
comment
Действительно ли он ждет все время?   -  person Arran    schedule 05.03.2015


Ответы (2)


Я решил просто не использовать WebDriverWait.Until() и вместо этого использовать неявные ожидания в основном драйвере:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

Я отдаю должное этому ответу на другом вопрос для того, чтобы дать мне идею.

person levininja    schedule 04.03.2015

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
        {
            try
            {
                if (timeoutInSeconds > 0)
                {
                    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
                    return wait.Until(drv => drv.FindElement(by));
                }
                return driver.FindElement(by);
            }
            catch
            {
                throw;
            }
        }

или если у вас есть

NoSuchElementException

попробуйте этот код

 try
        {
            if (timeoutInSeconds > 0)
            {
                var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)).Until(ExpectedConditions.ElementIsVisible(by));
            }
            return driver.FindElement(by);
        }
        catch(Exception e)
        {
            throw;
        }
person Raymond Dumalaog    schedule 07.03.2017