【问题标题】:VS Ordered Tests with Selenium WebDriver won't continue after first test due to ChomeDriver closing由于 ChromeDriver 关闭,使用 Selenium WebDriver 的 VS 有序测试在第一次测试后不会继续
【发布时间】:2017-11-15 17:19:06
【问题描述】:

所以我已经设置了一个自动化框架,并且对于我想要运行的每个测试,我都创建了自己的单元测试。在我们的冒烟测试期间,我们运行了几个我按顺序构建的单元测试。因此,我认为创建有序测试是个好主意。当单独运行每个测试时,它们工作得很好。但是,一旦我开始运行有序测试,列表中的第一个测试就会运行,但随后出现此错误:

OpenQA.Selenium.WebDriverException:意外错误。 System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: 由于目标机器主动拒绝,无法建立连接

我发现这个问题是由于 ChromeDriver 在第一次测试结束时关闭而引起的。但是,即使我告诉它不要关闭驱动程序,它似乎也关闭了它。如果我告诉每个单元测试的 [SetUp] 创建一个新驱动程序,它似乎也不起作用。

我现在已经设置了这样的代码:

public static IWebDriver getWebDriver()
{
    IWebDriver newDriver = new ChromeDriver(@"..\..\..\packages\Selenium.Chrome.WebDriver.2.33\driver");

    return newDriver;
}

public static IWebDriver webDriver;

然后从单元测试中我设置 webDriver = getWebDriver() 这应该会导致它创建一个新的。我也尝试在单个单元测试中创建多个 [TestMethod],但它最终仍然给我同样的错误。我真的不知道我现在应该做什么,而且我还很新,没有同行指导我工作。任何方向将不胜感激!

【问题讨论】:

    标签: c# visual-studio unit-testing selenium testing


    【解决方案1】:

    我也遇到过类似的错误。起初我认为错误出在 chromedriver 上,但经过数小时的调查后,我发现当我看到此错误时,它是以下两件事之一:

    1. Chrome 版本 vs chromedriver 版本 vs selenium 版本。 因此,第一件事(您可能已经完成)是确保您拥有最新最好的 nuget 包版本。 (Chrome 当然会处理它自己的更新——这通常是导致问题的原因)。

    2. 仔细查看您的代码并确保您具有应用程序级别“Try Catch”。 This article from Microsoft should help.

    我在自己的代码中发现看起来像是 chromedriver 问题,实际上是从一个页面移动到另一个页面时的时间问题。现在我有方法可以验证我在正确的页面上,并且有方法可以在我尝试使用它们之前验证页面元素是否存在。我最终写了很多:

     if (driver.PageSource.Contains("Some text that means the page is loaded"))
    

    我还在页面的每次交互后面添加了少量等待时间,这可能需要一些时间。在尝试使用它之前,您需要确保您使用的每个元素都存在。我是这样做的:

     if (IsElementDisplayed(driver, By.XPath(Settings.Default.X_GenerateButton)))
     {
          //click the generate button
          driver.FindElement(By.XPath(Settings.Default.X_GenerateButton)).Click();
    
          //wait for a couple of seconds
          Thread.Sleep(2000);
    
     }
    

    这是我的 IsElementDisplayed 方法的样子:

     public bool IsElementDisplayed(IWebDriver driver, By element)
     {
    
            for (int i = 1; i <= 5; i++)
            {
                try
                {
                    IReadOnlyCollection<IWebElement> elements = driver.FindElements(element);
                    if (elements.Count > 0)
                    {
                        return elements.ElementAt(0).Displayed;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception was raised on locating element: " + e.Message);
                    Thread.Sleep(1000);
                }
            }
            return false;
     }
    

    希望这会有所帮助,祝你好运找到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多