2013-12-12 3 views
0

Как использовать ожидания в селене webdriver с помощью C#? Меня попросили не использовать заявление об ошибке моего диспетчера тестов.Как использовать ожидания в selenium webdriver

System.Threading.Thread.Sleep(6000); 
+0

http://stackoverflow.com/questions/91108/how-do-i-get-my-c-sharp-program-to-sleep-for-50-msec посмотреть ответы на них. – elyashiv

+0

проверить https://github.com/ddavison/getting-started-with-selenium/blob/master/src/main/java/com/company/seleniumframework/AutomationTest.java#L98 - предоставлено это проект java , но он легко переносится на C#. В этом примере показан базовый метод, который ожидает элемент. – sircapsalot

ответ

5

Это вообще плохая идея использовать Thread.Sleep в тестах UI, в основном из-за того, что, если веб-сервер просто происходит медленнее, по какой-то причине, и это заняло больше времени, чем 6000ms, чтобы загрузить эту страницу. Тогда тест завершится неудачно с ложным отрицательным результатом. Вообще то, что мы используем в наших тестах, - это ожидание методов в селене, документация может быть найдена в http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp, в основном идея заключается в том, что вы «ждете» определенного элемента, который вы ожидаете находиться на странице. Делая это, вам не нужно вручную ждать 6000 мс, когда на самом деле страница заняла 100 мс, чтобы загрузить элемент, который вы ожидаете, поэтому теперь он ждал только 100 мс вместо 6000 мс.

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

public static void WaitForElementNotPresent(this ISearchContext driver, By locator) 
    { 
     driver.TimerLoop(() => driver.FindElement(locator).Displayed, true, "Timeout: Element did not go away at: " + locator); 
    } 

    public static void WaitForElementToAppear(this ISearchContext driver, By locator) 
    { 
     driver.TimerLoop(() => driver.FindElement(locator).Displayed, false, "Timeout: Element not visible at: " + locator); 
    } 

    public static void TimerLoop(this ISearchContext driver, Func<bool> isComplete, bool exceptionCompleteResult, string timeoutMsg) 
    { 

     const int timeoutinteger = 10; 

     for (int second = 0; ; second++) 
     { 
      try 
      { 
       if (isComplete()) 
        return; 
       if (second >= timeoutinteger) 
        throw new TimeoutException(timeoutMsg); 
      } 
      catch (Exception ex) 
      { 
       if (exceptionCompleteResult) 
        return; 
       if (second >= timeoutinteger) 
        throw new TimeoutException(timeoutMsg, ex); 
      } 
      Thread.Sleep(100); 
     } 
    } 
+0

Спасибо! плохо проверьте, что – user3079912

+0

+1 для утверждения об использовании явных ожиданий. – sircapsalot

+0

driver.Manage(). Timeouts(). ImplicitlyWait (TimeSpan.FromSeconds (10)); Это сработало для меня. – user3079912

3

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

Task.Delay(1000).Wait(); // Wait 1 second 
Смежные вопросы