我在编写使用Selenium帮助的一些单元测试时,使用chromedriver.exe遇到了一个异常情况。当第一个使用chromedriver的测试执行时,浏览器启动并且测试通过。
然而,对于所有后续使用chromedriver的测试,浏览器无法成功导航到URL。
浏览器启动后,地址栏短暂地显示data;字符(与第一个测试中相同),然后正确的URL被插入到地址栏中。然而,页面从未加载,并且您在浏览器的正文/画布中看到标准的Chrome“此网页不可用”消息以及两个按钮重新加载和更多。
这是已知的问题吗?
我正在使用以下版本:
Selenium:2.41.0.0
Chromedriver.exe:2.9.0.0
Visual Studio 2013:12.0.30110.00 Update 1
我在我的ChromeTestDriver类中有以下Initialize方法,该方法在所有测试的Setup方法(又名TestInitialize)中调用:
ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(DriverPath);
var chromeOptions = new ChromeOptions();
chromeDriverService.Port = DriverPort; // 9999 - this is the port for the driver, not the webpage
webDriver = new ChromeDriver(chromeDriverService, chromeOptions);
webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
webDriver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(10));
我在所有测试的清理方法(也称为Teardown)中有以下代码:
TestDriver.CloseWindow();
TestDriver.Quit();
以下异常被抛出:OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed
如果需要更多信息,请告诉我。
编辑
我发现在 Chrome 失败之前必须先运行 IE 测试。通常情况下,以下情况会发生。Chrome 测试正常运行。然后运行 IE 测试。在此之后,所有 Chrome 测试都会失败。
进一步编辑
另一个不寻常的方面是,一旦 Selenium 损坏了该网站的 Chrome 浏览器,我就再也无法在 Chrome 中加载该网站。也就是说,如果我在 Chrome 的地址栏中手动输入 URL,将显示相同的空白页面。
更奇怪的是,如果我启动 Fiddler2(基本上是代理),Chrome 就会变得干净,它会重新工作。
我很有信心代理不是问题,因为我的系统没有代理,并且当从我的系统卸载 Fiddler2 后,仍会发生相同的结果。
这些症状也可以由位于其他大陆的客户端复制。我们使用 GIT 进行协作。因此,它不仅限于我的系统。
Selenium Google 用户组上的用户建议使用 webdriver 在真正简单的场景中(即不作为测试框架的一部分)重现 Bug。以下是我创建的控制台应用程序的代码:
private static string Url = "http://localhost:5556";
static void Main(string[] args)
{
var chromeWebDriver = GetChromeWebDriver();
var nav = chromeWebDriver.Navigate();
nav.GoToUrl(Url);
Thread.Sleep(3000);
chromeWebDriver.Quit();
chromeWebDriver.Dispose();
var iedriver = GetIeDriver();
var nav1 = iedriver.Navigate();
nav1.GoToUrl(Url);
iedriver.Quit();
iedriver.Dispose();
var chromeWebDriver2 = GetChromeWebDriver();
var nav2 = chromeWebDriver2.Navigate();
nav2.GoToUrl(Url);
chromeWebDriver2.FindElement(By.LinkText("Login")).Click();
System.Threading.Thread.Sleep(2000);
chromeWebDriver2.Quit();
chromeWebDriver2.Dispose();
Console.ReadLine();
}
private static IWebDriver GetIeDriver()
{
InternetExplorerDriverService internetExplorerDriverService =
InternetExplorerDriverService.CreateDefaultService(
@"H:\BW\packages\Selenium.WebDriver.IEDriver.2.41.0.1\content");
InternetExplorerOptions internetExplorerOptions = new InternetExplorerOptions();
internetExplorerDriverService.Port = 9999;
IWebDriver webdriver = new InternetExplorerDriver(internetExplorerDriverService, internetExplorerOptions);
return webdriver;
}
private static IWebDriver GetChromeWebDriver()
{
var chromeDriverService =
ChromeDriverService.CreateDefaultService(
@"H:\BW\packages\Selenium.WebDriver.ChromeDriver.2.10.0.0\content");
var chromeOptions = new ChromeOptions();
chromeDriverService.Port = 7777;
IWebDriver chromeWebDriver = new ChromeDriver(chromeDriverService, chromeOptions);
return chromeWebDriver;
}