Search code examples
c#unit-testingseleniummstestsystem-testing

What's the alternative to use Thread.Sleep when working with Selenium in system testing?


I have a TestMethod using Selenium as below:

 [TestMethod]
        public void ShouldSendPasswordReminder()
        {
            // go to loginregister url
            _fireFoxWebDriver.Navigate().GoToUrl(UkPaBaseUrl + "loginregister.aspx");
            Thread.Sleep(1000);

            // click the forgotten password
            _fireFoxWebDriver.FindElement(By.LinkText("Forgotten your password?")).Click();
            Thread.Sleep(1000);

            // enter your email address

            _fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_Username"))
                .SendKeys("username.lastname@domain.com");
            Thread.Sleep(1000);

            // click submit
            _fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_PasswordResetRequestSubmit")).Click();
            Thread.Sleep(5000);

            // assert
            Assert.IsTrue(_fireFoxWebDriver.Url.Contains("ThankYou"));
        }

As you can see, I'd have to call Thread.Sleep many times (because the page might take some time to finish what it does due to javascript, etc) almost after each action because Selenium doesn't seem to be able to handle page loads and delays unlike WatiN.

This makes the code rather ugly and not very much reliable.

What's the better way to handle such scenarios? Do you write frequent Thread.Sleep calls in your tests as well?

Thanks,


Solution

  • You could use the manage functionality to set the base line time you want FindElement() to wait for before failing:

    _fireFoxWebDriver.Manage()
                     .Timeouts()
                     .ImplicitlyWait(TimeSpan.FromSeconds(1000));