【问题标题】:Chromedriver Not Loading Page in Selenium TestsChromedriver 未在 Selenium 测试中加载页面
【发布时间】:2014-05-11 16:00:12
【问题描述】:

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

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

浏览器启动,字符 data; 立即出现在地址栏中(就像在第一个有效的测试中所做的那样),然后将正确的 URL 插入到地址栏中。但是,该页面永远不会加载,并且您会在浏览器的正文/画布中收到标准 chrome 此网页不可用 消息,其中包含两个按钮 reloadmore

这是一个已知问题吗?

我正在使用以下版本:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这通过指示端口号解决了我的问题,因为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");
    }
    

    【讨论】:

      【解决方案3】:

      试试这个代码。这很简单,它会解决你的问题。

      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 将关闭所有客户端,因此如果您发送退出并且没有活动会话,它只会清理

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 他们每个人都在监听不同的端口。 9999 上的 Chrome 和 8888 上的 IE。我以前从那个陷阱中吸取了教训。
        【解决方案5】:

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

        【讨论】:

        • 感谢您的建议,但并没有解决问题。 Chrome 页面仍在加载,因为此网页不可用。第一个测试有效,但所有后续尝试使用 ChromeDriver 都会收到该标准消息。
        • 两件事: 1.尝试使用IP地址而不是localhost,希望它能解决问题。 2.我想知道Initialize和Cleanup方法是在Assembly、Class或Method级别实现的。
        【解决方案6】:

        试试 Chromedriver v2.7

        因为我也面临同样的问题

        【讨论】:

        • 恢复到 2.7 并没有解决问题。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 2020-04-04
        • 1970-01-01
        • 2016-04-04
        • 2023-03-30
        相关资源
        最近更新 更多