【发布时间】:2014-05-11 16:00:12
【问题描述】:
我在使用 chromedriver.exe 时遇到了一个异常情况,我在 Selenium 的帮助下编写了一些单元测试。当使用 chromedriver 的第一个测试执行时,浏览器会启动并且测试通过。
但是,对于以下所有使用 chromedriver 的测试,浏览器都无法成功导航到 URL。
浏览器启动,字符 data; 立即出现在地址栏中(就像在第一个有效的测试中所做的那样),然后将正确的 URL 插入到地址栏中。但是,该页面永远不会加载,并且您会在浏览器的正文/画布中收到标准 chrome 此网页不可用 消息,其中包含两个按钮 reload 和 more 。
这是一个已知问题吗?
我正在使用以下版本:
硒:2.41.0.0
Chromedriver.exe:2.9.0.0
Visual Studio 2013:12.0.30110.00 更新 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));
我在所有测试的 Cleanup 方法(又名 Teardown)中有以下代码:
TestDriver.CloseWindow();
TestDriver.Quit();
以下异常被丢弃:
OpenQA.Selenium.NoSuchWindowException:没有这样的窗口:目标窗口已经关闭
如果我可以提供更多信息,请告诉我。
编辑 我观察到必须在 Chrome 失败之前先运行 IE 测试。一般会出现以下情况。 Chrome 测试运行良好。然后运行 IE 测试。之后,所有 Chrome 测试都失败了。
进一步编辑 另一个不寻常的方面是,一旦 chrome 被 Selenium 玷污了该网站,我就根本无法在 Chrome 中加载该网站。也就是说,如果我在 Chrome 的地址栏中手动输入 URL,则会显示相同的空白页面。
更奇怪的是,如果我运行 Fiddler2(它基本上是一个代理),Chrome 就会变得干净。它再次起作用。
我相信代理不是问题,因为我的系统没有代理,当 Fiddler2 从我的系统中卸载时也会出现相同的结果。
我位于不同大陆的客户也可以重现这些症状。我们使用 GIT 进行协作。所以它并不局限于我的系统。
Selenium Google 用户组的一位用户建议在一个非常简单的场景(即不作为测试框架的一部分)中使用 webdriver 重现该错误。这是我为此创建的控制台应用程序的代码:
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;
}
【问题讨论】:
-
这看起来不像 TestNG(这是我使用的)。你用什么来做测试?在所有测试执行之后,您是否尝试过只执行一次
cleanup?根据我对 Selenium 的有限了解,初始化 ChromeDriver 的 API 似乎有所不同。我正在使用DesiredCapabilities dc = DesiredCapabilities.chrome();方式进行初始化。也许这可能会帮助你。 (我知道我在这里捡稻草) -
@Vish DesiredCapabilities API 似乎是用于远程的。我正在本地运行我的测试。此外,TestNG 是 Java 的东西,而我使用的是 .NET。这可能就是 API 看起来不同的原因。谢谢。
-
我不确定这是真的 - 我也在本地运行我的测试并使用 DesiredCapabilities API。好的,谢谢你的澄清。
-
@Vish 也许吧。快速浏览了this page,这表明它存在的某种客户端/服务器原因。干杯。
-
Chrome 版本?你使用代理吗?如果你让 Selenium 打开一个 Chrome 窗口,在其中放置一个断点,让它停止一秒钟,然后手动使用 那个 Chrome 实例导航到某个地方......你明白了吗同样的问题?
标签: selenium selenium-webdriver selenium-chromedriver