Nick Kahn
Nick Kahn

Reputation: 20078

WebDriverWait or ImplicitlyWait or ExplictlyWait nothing works

I'm using Selenium 2 tests (written in C#) that choose values from a "select" control. Selection causes a post-back to the server, which updates the state of the page. I am therefore performing a manual wait (thread.sleep) after choosing a value to wait for the page to be changed. and it works fine with Thread.Sleep. However, Thread.Sleep is a bad idea to use with number of good reasons so when I take out all my Thread.Sleep line of code then all my test cases fall apart and I have tried WebDriverWait, Implicitly and Explicitly none works and very frustration

below is the sample code that I have tried....

//WebDriverWait

 public IWebElement WaitForElement(By by)
 {
            // Tell webdriver to wait
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
            wait.PollingInterval = TimeSpan.FromSeconds(2);
            wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException));
            wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException), typeof(StaleElementReferenceException));

            IWebElement myWait = wait.Until(x => x.FindElement(by));
            return myWait;
}

Tried this too:

   WebDriverWait wait = new WebDriverWait(new SystemClock(), driver, TimeSpan.FromSeconds(30), TimeSpan.FromMilliseconds(100));

//Implicitly:

driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 30));

//Explicit Wait:

IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

Upvotes: 7

Views: 8760

Answers (3)

nexoma
nexoma

Reputation: 285

I find a solution with stackoverflow :) and this works:

click on partialLinkText("Exit")
remote.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS)
remote.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS)
// Thread.sleep(7000) // for js-work
(new WebDriverWait(remote, 245)).until(presenceOfElementLocated(By.partialLinkText("""Entry for > technician""")))
// Thread.sleep(3000) // for js-works

Upvotes: 0

hacket
hacket

Reputation: 1161

Here is what works for me ->

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 0, 30));

element = wait.Until<IWebElement>((driver) =>
  {
     return driver.FindElement(By.Name("name_of_element")));
  });

You can also do by ID ->

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 0, 30));

element = wait.Until<IWebElement>((driver) =>
  {
     return driver.FindElement(By.Id("id_of_element")));
  });

Without seeing more of your code, it will be hard to determine why it's not working.

Upvotes: 1

dev_il
dev_il

Reputation: 326

try to use

new WebDriverWait(driver, 30).until(ExpectedConditions.presenseOfElementLocated(byLocator));

Upvotes: 0

Related Questions