【问题标题】:Kill GeckoDriver by PID Process [Java]通过 PID 进程杀死 GeckoDriver [Java]
【发布时间】:2020-03-02 13:59:12
【问题描述】:

我的问题与this question 非常相似。我启动了许多WebDriver 的实例,其中一些没有响应driver.quit()。如this response 中所述,我可以通过以下代码从功能对象中直接检索 PID 来终止浏览器实例:

  • 代码块:

    import java.io.IOException;
    import org.openqa.selenium.Capabilities;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.remote.RemoteWebDriver;
    
    public class Kill_Firefox_PID {
    
        public static void main(String[] args) throws IOException {
    
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            Capabilities cap = ((RemoteWebDriver) driver).getCapabilities();
            System.out.println("moz:processID value is : "+cap.getCapability("moz:processID"));
            Runtime.getRuntime().exec("taskkill /PID "+cap.getCapability("moz:processID"));
        }
    }
    
  • 控制台输出:

    moz:processID value is : 8492
    

虽然这可以很好地杀死浏览器本身,但当我打开任务管理器时,我仍然会看到 Geckodriver 的实例。正如另一个线程中所述,我无法通过taskkill /f /im geckodriver.exe 不加选择地杀死所有Geckdriver 实例,因为需要一些实例。

简而言之,我希望能够通过功能检索Geckodriver 的 PID,并以类似于我们能够检索Firefox WebDriver 的 PID 的类似方式销毁Geckodriver 的那些实例,如@概述987654323@.

这可能吗?

谢谢!

【问题讨论】:

    标签: selenium selenium-webdriver process pid geckodriver


    【解决方案1】:

    当您调用时会启动一组新的 GeckoDriverFirefox 浏览器

    WebDriver driver = new FirefoxDriver();
    

    您可以在Is this correct - FirefoxDriver driver = new FirefoxDriver();?找到详细讨论


    GeckoDriver / Firefox Browser 的生命周期在您调用时不复存在:

    driver.quit()
    

    您可以在PhantomJS web driver stays in memory找到详细讨论


    解决方案

    因此,一个通用的解决方案是,按照流程调用 close()quit(),而不是保持/保留 的陈旧实例您的测试执行将免除您不加选择地杀死所有 GeckoDriver 实例。

    但是,在您的 Test Execution 结束时,如果您想杀死所有 GeckoDriver 实例,您可以使用以下解决方案:

    public class Killing_GeckoDriver_PID {
    
        public static void main(String[] args) throws IOException {
    
            String line;
            String pidInfo ="";
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
            BufferedReader input =  new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((line = input.readLine()) != null) {
                pidInfo+=line; 
            }
            input.close();
    
            if(pidInfo.contains("geckodriver.exe"))
            {
                Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe"); 
            }
            System.out.println("Killed all the instances of GeckoDriver");
        }
    }
    

    您可以在讨论Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?中找到替代方法

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 2014-11-24
      • 2021-11-29
      • 1970-01-01
      • 2015-12-31
      • 2017-08-04
      • 2014-09-07
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多