如何避免在C#Selenium 2.44 Chrome驱动程序中使用Thread.Sleep?

时间:2014-12-21 13:25:58

标签: c# google-chrome selenium thread-sleep automated-tests

以下是我的开发环境的详细信息:

-Visual Studio 2012 Ultimate with Update 4

-Google Chrome版本38.0.2125.111 m

-Windows 7 Professional with 32-bit Operating System

-Selenium .NET 2.44.0

-NUnit

借助Selenium 2.44.0的Firefox驱动程序,自动化UI可以快速,正常地运行。此外,我没有使用任何Thread.Sleep与使用Selenium 2.44.0的Firefox驱动程序的C#代码

使用Selenium 2.44.0的Firefox驱动程序的示例C#代码

       IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
        wait.Until(driver1 => ((IJavaScriptExecutor)drvArg).ExecuteScript("return       document.readyState").Equals("complete"));
                 String find1stLnkXpath   = "//div[@class='jarviswidget jarviswidget-sortable']/descendant::div[@role='content']/descendant::div[@id='grid-container']/descendant::table[@class='k-selectable' and @role='grid']/tbody/tr[1]/td/descendant::a[@class='k-button k-button-icontext k-grid-view']";
        Thread.Sleep(threadSleepTimeArg);
        wait.Until(drv => (true == Exists(drv, By.XPath(find1stLnkXpath))));
        wait.Until(drv => isClickable(drv, By.XPath(find1stLnkXpath)));

        wait.Until(drv => (true == Exists(drv, By.XPath(find1stLnkXpath))));
        // k-button k-button-icontext k-grid-view
        // class="k-selectable" role="grid"
        IWebElement viewCustDetlnk = wait.Until(ElementIsClickable(By.XPath(find1stLnkXpath)));
        viewCustDetlnk.Click();

可悲的是,Selenium 2.44.0的Chrome驱动程序(Chromedriver Win32 2.12)运行缓慢,我被迫使用Thread.Sleep和使用Selenium 2.44.0 Chrome驱动程序的C#代码,以确保自动化UI工作正常。

使用Selenium 2.44.0的Chrome驱动程序(Chromedriver Win32 2.12)的示例C#代码

 IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));



            wait.Until(driver1 => ((IJavaScriptExecutor)drvArg).ExecuteScript("return       document.readyState").Equals("complete"));
                     String find1stLnkXpath   = "//div[@class='jarviswidget jarviswidget-sortable']/descendant::div[@role='content']/descendant::div[@id='grid-container']/descendant::table[@class='k-selectable' and @role='grid']/tbody/tr[1]/td/descendant::a[@class='k-button k-button-icontext k-grid-view']";

           Thread.Sleep(3000);

            wait.Until(drv => (true == Exists(drv, By.XPath(find1stLnkXpath))));
            wait.Until(drv => isClickable(drv, By.XPath(find1stLnkXpath)));

            wait.Until(drv => (true == Exists(drv, By.XPath(find1stLnkXpath))));

             IWebElement viewCustDetlnk = wait.Until(ElementIsClickable(By.XPath(find1stLnkXpath)));
            viewCustDetlnk.Click();

请告诉我如何修改Selenium 2.44.0的Chrome驱动程序(Chromedriver Win32 2.12)的代码,以便我可以避免使用Thread.Sleep

1 个答案:

答案 0 :(得分:0)

在我们的应用程序的GUI中,我们有一个div html元素,表现为一个看不见的加载屏幕,我们需要等待它不再存在 在我们点击按钮之前。 对于使用Selenium 2.44.0的Firefox驱动程序的测试代码,Wait对象可以等到看不见的  加载屏幕在代码尝试查找按钮对象之前不再存在。

奇怪的是,使用Selenium 2.44.0的Chrome驱动程序(Chromedriver Win32 2.12)的测试代码需要使用Wait对象等到看不见的  加载屏幕在我的代码尝试甚至单击按钮对象之前不存在:

wait.Until(drv => ! Exists(drv, By.CssSelector("div.loading-screen"); 
btn.Click();

Selenium 2.44.0的Chrome驱动程序(Chromedriver Win32 2.12)似乎仍有一些小问题。