Убить GeckoDriver с помощью процесса PID [Java] - PullRequest
0 голосов
/ 06 ноября 2019

Мой вопрос очень похож на этот вопрос . Я запускаю много экземпляров WebDriver, и некоторые из них не отвечают на driver.quit(). Как описано в этом ответе Я могу уничтожить экземпляр браузера, получив 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когда я открываю диспетчер задач. Как указано в другом потоке, я не могу без разбора уничтожить все Geckdriver экземпляры через taskkill /f /im geckodriver.exe, поскольку есть некоторые необходимые экземпляры.

Короче говоря, я хочу иметь возможность получить PID Geckodriver через возможности и уничтожить эти экземпляры Geckodriver (через PID) аналогичным образом, что мы можем получить PID Firefox WebDriver, как указано в ответ на этот вопрос .

Возможно ли это?

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Новый набор GeckoDriver и Браузер Firefox запускается при вызове:

WebDriver driver = new FirefoxDriver();

Подробное обсуждение можно найти в Это правильно - драйвер FirefoxDriver = новый FirefoxDriver ();?


Срок службы GeckoDriver / Браузер Firefox прекращаетсясуществовать при вызове:

driver.quit()

Подробное обсуждение можно найти в Веб-драйвер PhantomJS остается в памяти


Решение

Таким образом, общее решение было бы вместо сохранения / сохранения устаревших экземпляров invoke close() или quit() согласно ходу выполнения вашего теста, который избавит вас от неизбирательного убийства всех GeckoDriver экземпляров.

Однако в конце вашего выполнения теста , если вы хотитечтобы убить все GeckoDriver экземпляров, вы можете использовать следующие решенияon:

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: Как остановить процесс geckodriver, влияющий на память ПК, без вызова driver.quit ()?

...