ChromeDriver在Selenium测试中无法加载页面

11

我在编写使用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;
}

这看起来不像是我使用的TestNG。你用什么来进行测试?你尝试过在所有测试执行后只清理一次吗?从我有限的Selenium知识来看,初始化ChromeDriver的API似乎不同。我使用“DesiredCapabilities dc = DesiredCapabilities.chrome();”的方式进行初始化。也许这可以帮助你。(我知道我在抓瞎) - Vish
我不确定那是真的 - 我也在本地运行我的测试,并使用了DesiredCapabilities API。好的,谢谢澄清。 - Vish
@Vish或许吧。我快速查看了这个页面,它暗示了某种客户端/服务器的原因。谢谢。 - onefootswill
Chrome的版本?你使用代理吗?如果你让Selenium打开一个Chrome窗口,在那里设置一个断点,让它停止一秒钟,然后手动使用那个Chrome实例去浏览某个网址...你会遇到同样的问题吗? - Arran
你是否考虑过使用单例模式来替换初始化驱动程序呢?这样做可以让你在测试套件结束时调用拆卸方法,而不是在每个测试之后。这样,在每个测试中都将使用同一个驱动程序实例。 - olyv
显示剩余4条评论
6个回答

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();

Close会关闭当前活动窗口,如果它是最后一个窗口,则执行quit()操作,

如果您的测试失败,那么该会话可能已经关闭,因此当您调用close时,它不知道要发送命令并且不执行任何操作。

Quit将关闭所有客户端,如果没有活动会话,则发送一个quit命令并且没有活动会话,它将进行清理操作。


0

我曾经遇到过同样的问题,原因是我使用了错误的ChromeDriver。最好从官方网站第三方浏览器驱动程序http://www.seleniumhq.org/download/下载驱动程序。


0

如果您不需要处理多个打开的窗口,那么您可以直接使用TestDriver.Quit();来关闭窗口,这样就可以达到目的,窗口会自动关闭,无需在代码中包含额外的方法,如TestDriver.CloseWindow();


谢谢您的建议,但它并没有解决问题。Chrome页面仍在加载中,显示“此网页不可用”。第一次测试可以正常运行,但所有后续尝试使用ChromeDriver都会得到该标准消息。 - onefootswill
两件事情:
  1. 尝试使用IP地址而不是本地主机,希望能解决问题。
  2. 我想知道Initialize和Cleanup方法是在程序集、类还是方法级别实现的。
- Varun Bajpai

0

尝试使用Chromedriver v2.7

因为我也遇到了同样的问题


回到2.7版本并没有解决问题。谢谢。 - onefootswill

0

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

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


他们已经分别在不同的端口上监听了。Chrome在9999上,IE在8888上。我之前就从那个陷阱中学到了教训。 - onefootswill

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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接