Selenium remotewebdriver启动浏览器二进制文件,但没有获得webdriver - 如何清理浏览器进程

时间:2017-08-16 01:20:17

标签: selenium firefox browser remotewebdriver resource-cleanup

我们在基础架构中运行,有时会陷入困境。我们看到发生的事情是,当我们进行remotewebdriver调用时,启动了firefox.exe,但由于机器速度很慢而且我们有15秒超时,因此创建webdriver不会成功。所以我们失败了,但现在我们有一个使用内存的胭脂firefox进程 - 在对我们的远程selenium机器开始大量的构建后,我们看到数百个剩余的firefox进程坐在那里。我不能关闭或退出驱动程序 - 我没有驱动程序,因为调用remotewebdriver失败....我怎么知道我们刚刚创建的firefox进程杀了它?这是应该用硒清理的吗?我们正在使用java。

2 个答案:

答案 0 :(得分:0)

正如您提到的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只会使我们尝试启动Application live以启动测试过程失败。因此,更好的选择是让WebDriver实例正常启动应用程序,以便SeleniumDocument.readyState == complete获得干净的DOM tree
  2. 当你谈到机器很慢时,下一步的操作是确保Test Bed配置了必需的Hardware (CPU, RAM, ROM, Cache) and Software (Selenium, WebDriver, WebBrowser versions) resources。确保运行Test MachinesAutomation Script的{​​{1}}与其他用户互动隔离。
  3. 此外,如果您想要切断页面加载时间,并希望在加载Testcases后立即与WebElements进行交互,那么您可以考虑调整 pageLoadStrategy < / strong>即可。 pageLoadStrategy 的默认设置为 normal ,我们可以将其更改为 eager 。将 pageLoadStrategy 设置为 eager 表示只要WebElements加载HTML DOM并且 interactive ,您的脚本将继续执行。
  4. 现在,您可以通过将阻止程序部分代码保留在hundreds of leftover firefox processes sitting out there块中来处理try的主要问题。如果try内的代码块成功,我们的脚本就会继续。如果try失败,我们将在quit()块中调用catch(),以便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 :(得分:0)

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

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

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