【问题标题】:Selenium remotewebdriver starts browser binary but doesn't get a webdriver - how can I clean up the browser processSelenium remotewebdriver 启动浏览器二进制文件但没有获得 webdriver - 我如何清理浏览器进程
【发布时间】:2017-08-16 01:20:16
【问题描述】:

我们在一个有时会陷入困境的基础架构中运行。我们所看到的情况是,当我们调用 remotewebdriver 时,firefox.exe 会启动,但由于机器太慢而且我们有 15 秒的超时,所以创建 webdriver 没有成功。所以我们失败了,但现在我们有一个 rouge firefox 进程在那里耗尽了内存——在针对我们的远程 selenium 机器启动了大量构建之后,我们看到数百个剩余的 firefox 进程坐在那里。我无法关闭或退出驱动程序 - 由于对 remotewebdriver 的调用失败,我没有驱动程序......我怎么知道我们刚刚创建了哪个 firefox 进程来杀死它?这是应该用硒清理的东西吗?我们正在使用 java。

【问题讨论】:

    标签: selenium firefox browser remotewebdriver resource-cleanup


    【解决方案1】:

    为避免此类问题,您应确保在不再需要浏览器时调用 driver.quit()

    假设 Java 堆栈,您很可能正在使用 TestNG 或 JUnit 框架。资源释放的最佳位置是@After... 方法之一(取决于选择的会话管理策略)或特殊侦听器。例如:

    @AfterMethod
    public void tearDown() {
        if (driver != null)
            driver.quit();
    }
    

    【讨论】:

    • 问题是我没有驱动——你错过了那部分——驱动没有被创建——只有firefox进程......
    • @A.Reitmeyer 不,我没有错过。以及您没有提供任何堆栈跟踪和网格日志/配置。请详细说明。尤其是当您谈论超时时。
    • Selenium / 浏览器 / 驱动程序版本规范也会有所帮助。
    【解决方案2】:

    正如您提到的firefox.exe is started but because the machine is so slow and we have a 15 second timeout, creating the webdriver does not succeedsee hundreds of leftover firefox processes sitting out there,我有一个4 点解决方案可能适合您。

    1. 由于我们的目标是测试应用程序,所以我认为无论如何我们都不能修改页面的加载。设置15 second timeout 只会使我们尝试启动应用程序以启动测试过程失败。因此,更好的选择是让WebDriver 实例正常启动应用程序,以便SeleniumDOM tree 获得干净的Document.readyState == complete
    2. 正如你所说的机器很慢,接下来的操作是确保Test Bed 配置了所需的Hardware (CPU, RAM, ROM, Cache) and Software (Selenium, WebDriver, WebBrowser versions) resources。确保运行Automation ScriptTestcasesTest Machines 与其他用户交互隔离。
    3. 此外,如果您想缩短页面加载时间并希望在 WebElements 加载后立即开始与它们交互,那么您可以考虑调整 pageLoadStrategypageLoadStrategy 的默认设置是 normal,我们可以将其更改为 eager。将 pageLoadStrategy 设置为 eager 意味着只要在 HTML DOM 中加载了 WebElements 并且是 interactive ,您的脚本将继续执行。
    4. 现在,您对hundreds of leftover firefox processes sitting out there 的主要关注可以通过将代码的阻塞部分保留在try 块中来解决。如果try 中的代码块成功,我们的脚本将继续。如果try 失败,我们将在catch() 块中调用quit(),以便Firefox 浏览器实例和WebDriver 实例正常退出。代码块蓝图如下:

      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      
      public class Q45703729_firefox_process {
      
          public static void main(String[] args) {
      
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              try {
                  driver.get("https://stackoverflow.com");
                  System.out.println("Application opened");
              } catch (Exception e) {
                  System.out.println("Unable to open Application. Quiting ...");
                  driver.quit();
              }
              System.out.println("Page Title is : "+driver.getTitle());
              //Do other tasks
              driver.quit();
          }
      }
      

    【讨论】:

    • 对于 1 点:- 您正在强调并打算回复的短语 firefox.exe is started but because the machine.... 包含在代码格式中所以我想如果您将其设为斜体或粗体会更好。第 2 点:是的,花括号完全没有问题,我更改了它们以提高可读性。我以任何方式回滚更改。
    • 第 2 点和第 3 点与我的问题无关。第 1 点对我来说也不是一个有效的答案——在这种情况下,页面很可能永远不会加载。 firefox.exe 进程已启动,但 geckodriver.exe 未启动。我需要一种方法来清理它。因此 - 第 4 点对我也无效,因为我从来没有司机。
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多