【问题标题】:Selenium Force Close FirefoxSelenium 强制关闭 Firefox
【发布时间】:2013-11-28 06:03:25
【问题描述】:
    ProfilesIni profile = new ProfilesIni();
    FirefoxProfile ff = profile.getProfile("ScreenCapture");
    WebDriver driver = new FirefoxDriver(ff);
    driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    driver.get(url);

    Thread.sleep(8000);

    File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

    driver.quit();

不应该 driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); 在 15 秒后强制关闭 selenium 生成的 Firefox 浏览器吗?浏览器只是坐着说它正在传输一个小时以上的数据。基本上只是挂着说它正在转移......

我正在捕获 ajax 繁重的页面,这就是为什么我要求所有内容在页面加载后等待 8 秒。但这应该与驱动程序在 15 秒后强制关闭无关。

我哪里错了?

详细信息:Centos x64 6.4 与 Firefox 10.0.12 和 10 分钟前的最新 Selenium。

我可以用 Java 做些什么来解决这个问题吗?

问题:如何在 N 秒后强制关闭 Selenium 生成的 Firefox 窗口?

【问题讨论】:

  • 隐式等待功能旨在强制 Selenium 在使用 findElement 定位元素时等待(在您的情况下为 15 秒)以等待元素出现。但是,在您显示的代码的情况下,没有进行任何 findElement 调用。这应该会创建一个新的 firefox 实例,等待 8 秒,截屏,退出 firefox,然后退出驱动程序。
  • 谢谢@Richard 如果只是使用 Selenium 挂起,我如何在 15 秒后强制关闭浏览器?
  • 如果 firefox 仍在运行,您可以在 n 秒后终止 firefox 进程。
  • @Faiz 你能在 n 秒后将一些 Java 放入答案中吗?这就是我难倒的地方......
  • @Chris - 添加了一个带有 java 代码的答案以终止进程。

标签: selenium selenium-webdriver


【解决方案1】:

如果你将 Junit 与 Java 一起使用,那么类似这样的东西:-

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }

注意:- 要了解如何编写它的完整框架,只需下载 FF 的 selenium IDE 并将一些测试用例导出到 Java /jUnit。

【讨论】:

  • 谢谢你。我不知道如何在 java 中使用 junit。我认为 junit 是一种在 eclipse 中对小段代码进行单元测试的方法,这些代码最终会被写入更大的类、方法等
  • Junit 最初就是为此而设计的,但它也可以扩展到其他级别的测试。我建议按照注释阅读生成的 Junit/Java 文件,语法很容易解释。另外,我在答案中提到的基本上表明“@after”所有测试都已完成运行此方法(包括driver.quit())。它就像一个析构函数。
【解决方案2】:

我的linux知识有限,但是你可以通过运行linux命令pkill杀死一个进程。

driver.quit();
Thread.sleep(15000); //use a poll loop instead to check process running every 1 sec 
Runtime rt = Runtime.getRuntime();
rt.exec("pkill firefox"); 

我认为java进程需要有足够的权限才能杀死一个进程,但还没有尝试过。

【讨论】:

  • 谢谢!我有点卡在投票循环部分,所以今晚晚些时候我会深入挖掘。
【解决方案3】:

要跟进 Ardesco 的评论,示例如下:

    ProfilesIni profile = new ProfilesIni();
    FirefoxProfile ff = profile.getProfile("ScreenCapture");
    WebDriver driver = new FirefoxDriver(ff);
    driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
    try {
        driver.get(url);
    } catch (TimeoutException e) {
        System.out.println("15 seconds were over, force continue!");
    } finally {
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        driver.quit();
    }

try 部分将运行请求,但是当超过使用 pageLoadTimeout 设置的超时时间时,会引发我们catch 的异常。无论请求的页面是否在 15 秒内正确加载或是否引发异常,finally 部分都会运行。

【讨论】:

  • 欢迎来到 SO。请为您的问题添加适当的标签
【解决方案4】:

隐式等待不会在 15 秒后强制关闭浏览器。

在尝试在 DOM 中查找元素时使用隐式等待,在尝试加载页面时不使用它们。如果您希望 Selenium 在 15 秒后停止尝试加载页面,则需要设置 pageLoadTimeout,它的使用方式如下:

driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);

默认页面加载超时为 0(这意味着无限期等待),因此是您所看到的行为。

(这里显然假设您使用的驱动程序二进制文件已实现此方法。)

Selenium 中用于超时的 JavaDoc 可用 Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2015-04-03
    • 2013-07-22
    相关资源
    最近更新 更多