Chromedriver未在硒测试中加载页面

时间:2014-04-01 03:43:48

标签: selenium selenium-webdriver selenium-chromedriver

我正在遇到一个异常场景,使用chromedriver.exe和一些我在Selenium帮助下编写的单元测试。当执行使用chromedriver的第一个测试时,浏览器将启动并且测试通过。

但是,对于使用chromedriver的所有以下测试,浏览器无法成功导航到URL。

浏览器启动,暂时字符数据; 出现在地址栏中(就像在第一个有效的测试中一样),然后将正确的URL插入地址栏。但是,页面永远不会加载,您会在浏览器的正文/画布中获得标准的chrome 此网页不可用消息,其中包含两个按钮重新加载更多

这是一个已知问题吗?

我使用以下版本:

硒: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)); 

我在Cleanup方法(又名Teardown)中有以下代码用于所有测试:

TestDriver.CloseWindow();  
TestDriver.Quit();

以下异常被搞砸了:

  

OpenQA.Selenium.NoSuchWindowException:没有这样的窗口:目标窗口已经关闭

如果我能提供更多信息,请告诉我。

修改 我发现在Chrome发生故障之前必须首先运行IE测试。通常,会发生以下情况。 Chrome测试运行正常。然后运行IE测试。在此之后,所有Chrome测试都会失败。

进一步修改 另一个不同寻常的方面是,一旦Chrome被Selenium玷污了网站,我就再也无法在Chrome中加载网站了。也就是说,如果我在Chrome的地址栏中手动输入网址,则会显示相同的空白页面。

甚至更奇怪,如果我跑起来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;
}

6 个答案:

答案 0 :(得分:1)

试试这段代码。它很简单,它将解决您的问题。

if(browserType.equals("googleChrome")==true)
{

    System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\autoItfiles\\chromedriver.exe");
    driver = new ChromeDriver();

    Report.info("Google chrome browser is opened ");                
}

//关闭浏览器实例。不要使用close()方法,大多数情况下它不适用于Firefox

driver.quit();

关闭将关闭当前活动窗口,如果是最后一个窗口则执行quit(),

如果您的测试失败,那么会话可能已经死亡,那么当您致电时,它不知道发送命令的位置并且没有做任何事情。

如果没有活动会话,退出将关闭所有客户端,因此如果您发送退出并且没有活动会话,它将只清理

答案 1 :(得分:0)

尝试使用Chromedriver v2.7

因为我也面临同样的问题

答案 2 :(得分:0)

您可以直接使用TestDriver.Quit();,因为它可以达到目的,窗口会自动关闭,您的代码中不需要包含额外的方法,例如TestDriver.CloseWindow(); 如果你没有处理多个打开的窗户。

答案 3 :(得分:0)

您是否为所有驱动程序指定了相同的端口?如果是这样,那很可能是导致问题的原因。在您的方案中,IEDriverServer正在侦听端口9999.然后,当您启动ChromeDriver时,它也尝试使用端口9999,但不能,因为它已经被占用,所以您得到页面未找到错误。

尝试让驱动程序检索自己的端口,这将自动找到要使用的端口,然后看看会发生什么。

答案 4 :(得分:0)

这通过指示自ChromeDriver启动的端口号解决了我的问题,语句仅允许本地连接并指示它使用某个端口。

public static void main(String ... args){
    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver\\2.16\\chromedriver.exe");
    ChromeDriverService.Builder builder =  new ChromeDriverService.Builder();
    ChromeDriverService srvc = builder.usingDriverExecutable(new File("C:\\chromedriver\\2.16\\chromedriver.exe"))
                        .usingPort(9515).build();
    try {
        srvc.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Execute your test-script commands
    WebDriver driver = new ChromeDriver(srvc);
    driver.get("http://www.google.com");
    WebElement searchBox = driver.findElement(By.name("q"));
    searchBox.sendKeys("Chrome Driver");
}

答案 5 :(得分:0)

我遇到了同样的问题,因为我使用的是错误的ChromeDriver。如果您从官方网站http://www.seleniumhq.org/download/第三方浏览器驱动程序下载驱动程序,效果会更好。