Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I ask the Selenium-WebDriver to wait for few seconds after sendkey?

I'm working on a C# Selenium-WebDriver. After send key, I want to wait few seconds. I do the following code to wait for 2 seconds.

public static void press(params string[] keys)
{
       foreach (string key in keys) 
       { 
          WebDriver.SwitchTo().ActiveElement().SendKeys(key);
          Thread.Sleep(TimeSpan.FromSeconds(2));
       }
}

And I call like these:

press(Keys.Tab, Keys.Tab, Keys.Tab);

It works fine. Which one is a better way?

like image 679
LeMoussel Avatar asked Dec 27 '13 10:12

LeMoussel


1 Answers

I would avoid at all cost using something like that since it slows down tests, but I ran into a case where I didn't had other choices.

public void Wait(double delay, double interval)
{
    // Causes the WebDriver to wait for at least a fixed delay
    var now = DateTime.Now;
    var wait = new WebDriverWait(myWebDriver, TimeSpan.FromMilliseconds(delay));
    wait.PollingInterval = TimeSpan.FromMilliseconds(interval);
    wait.Until(wd=> (DateTime.Now - now) - TimeSpan.FromMilliseconds(delay) > TimeSpan.Zero);
}

It's always better to observe the DOM somehow, e.g.:

public void Wait(Func<IWebDriver, bool> condition, double delay)
{
    var ignoredExceptions = new List<Type>() { typeof(StaleElementReferenceException) };
    var wait = new WebDriverWait(myWebDriver, TimeSpan.FromMilliseconds(delay)));
    wait.IgnoreExceptionTypes(ignoredExceptions.ToArray());
    wait.Until(condition);
}

public void SelectionIsDoneDisplayingThings()
{
    Wait(driver => driver.FindElements(By.ClassName("selection")).All(x => x.Displayed), 250);
}
like image 160
Julien Bérubé Avatar answered Sep 21 '22 11:09

Julien Bérubé