Подтвердить что ты не робот

Фантомы не закрываются и не покидают сиротские процессы

На PhantomJS 1.9.2, ubuntu 12 LTS и Ghostdirver 1.04 вместе с селеном 2.35 Я получаю зависающие процессы phantomjs после моих тестов. Кто-нибудь знает, как это исправить?

Вот тестовая программа, демонстрирующая нечетное поведение:

package testing;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;

public class PhantomIsNotKilledDemo {

    private static WebDriver getDriver(){
        String browserPathStr = System.getProperty("selenium.pathToBrowser");
        if (browserPathStr == null) browserPathStr = "/home/user1/apps/phantomjs/bin/phantomjs";

        DesiredCapabilities caps = DesiredCapabilities.phantomjs();

        caps.setCapability("takesScreenshot", true);
        caps.setCapability(
                PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
                browserPathStr );

        WebDriver driver = new PhantomJSDriver(caps);

        return driver;
    }

    public static void main(String[] args) {
        int max = 10;
        for (int i = 0; i < max; i++){
            WebDriver d1 = getDriver();
            d1.get("http://www.imdb.com/title/tt1951264");

            System.out.println("done with cycle " + (i+1) +" of "+max);
            d1.close();
            //d1.quit();
        }

        System.out.println("done");
        System.exit(0);
    }
}

Чтобы запустить это, вы должны указать путь к вашему двоичному файлу phantomjs как системное свойство или установить соответствующую переменную.

После выполнения этого запуска я выполняю эту команду оболочки

ps -ef | grep phantomjs

и найти 10 зависающих процессов phantomjs.

Если я использую d1.quit() вместо этого, я получаю без висячего процесса. Это явно лучше, но все же я ожидал получить тот же результат с .close.

Обратите внимание, что это крестовый знак https://github.com/detro/ghostdriver/issues/162#issuecomment-25536311

Обновление. Это сообщение изменяется в соответствии с предложением Ричарда (см. ниже).

4b9b3361

Ответ 1

Вы должны использовать quit() для завершения процесса вместо close().

Как вы обнаружили, close закроет текущее окно (и браузер), но оно не завершит процесс. Это полезно, если вы собираетесь отправлять дополнительные команды в процесс или хотите проверить процесс.

Выйти - это когда вы хотите закрыть каждое окно и остановить процесс, который звучит так, как будто вы ищете.

документация для этих двух методов читает:

закрыть()

Закройте текущее окно, выйдя из браузера, если он последнее открытое окно.

бросить курить()

Выход из этого драйвера, закрытие каждого связанного окна.

Ответ 2

Я бы переписал ваш код примерно так:

public static void main(String[] args) {
    int max = 10;
    for (int i = 0; i < max; i++){
        WebDriver d1 = getDriver();

        d1.get("http://www.imdb.com/title/tt1951264");

        System.out.println("done with cycle " + (i+1) +" of "+max);
        d1.quit();
    }

    System.out.println("done");
    System.exit(0);
}

Я не совсем уверен, почему .close() не заканчивает работу с WebDriver. Теоретически .close() должен покинуть WebDriver, если он вызывается в последнем открытом окне. Возможно, что-то открывает второе окно, когда этот URL-адрес вызван? Или, может быть, .close() работает по-разному для phantomjs.

Что касается того, почему .quit() не закрывает все сеансы phantomjs, последний getDriver(), который вы вызываете, не имеет соответствующего .quit() вне цикла. Я реорганизовал цикл for для создания экземпляра WebDriver, выполнил ваш тест, а затем .quit() этот сеанс WebDriver/phantomjs в конце каждого цикла.