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

В Java лучше всего проверить, прекратил ли Selenium WebDriver

Мне нужно проверить коллекцию объектов страницы, чтобы увидеть, для каждого из них, если quit() был вызван в своем WebDriver.

Я написал следующий метод проверки состояния WebDriver:

public static boolean hasQuit(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (SessionNotFoundException e) {
            return true;
        }
}

Здесь проблема: мне не нравится бросать и ловить исключение, чтобы обнаружить истину логического, но похоже, что у меня нет выбора, поскольку API WebDriver не предоставляет метод для проверки того, вышел ли драйвер.

Итак, мой вопрос: есть ли лучший способ проверить, покинул ли WebDriver?

Я нашел аналогичный (и более общий) вопрос здесь, но у вопроса не было никакого кода, который был опробован, и единственный ответ заключался в том, чтобы всегда устанавливать значение WebDriver в значение null после завершения (что я не обязательно контролирую).

4b9b3361

Ответ 1

Если quit() был вызван, driver.toString() возвращает null:

>>> FirefoxDriver: firefox on XP (null))

В противном случае он возвращает хэш-код объекта:

>>> FirefoxDriver: firefox on XP (9f897f52-3a13-40d4-800b-7dec26a0c84d)

чтобы вы могли проверить значение null при назначении логического значения:

boolean hasQuit = driver.toString().contains("(null)");

Ответ 2

В зависимости от вашей ситуации существуют два подхода:

Ситуация 1: Расширение WebDriver не является реалистичным вариантом.

Это наиболее распространенная ситуация. Большинство разработчиков, работающих с Selenium, в реальных ситуациях, которые хотят, чтобы удобный способ сказать, что WebDriver вышел, работают в уже установленной тестовой среде и пытаются чтобы реорганизовать структуру, чтобы убедиться, что используются только ваши собственные расширения WebDrivers, вероятно, больше проблем, чем это стоит.

В этом случае ответ Саджана и рекомендация Гили о его ответе не будут полезны, потому что переопределение RemoteWebDriver#stopClient() не является вариантом. (Кроме того, даже если бы это было так, большинство людей ищут простой ответ.)

Пока вы используете стандартные версии WebDriver, которые поставляются с Selenium (FirefoxDriver, ChromeDriver, InternetExplorerDriver, SafariDriver и т.д.), вы можете отправить WebDriver в RemoteWebDriver, а затем проверить, является ли sessionId нулевым (Pat был на правильном пути, но прямой вызов sessionId лучше, чем использование toString()).

public static boolean hasQuit(WebDriver driver) {
    return ((RemoteWebDriver)driver).getSessionId() == null;
}

Этот ответ должен быть хорошим для 95% всех случаев, потому что как часто вы собираетесь использовать WebDriver, который не использует RemoteWebDriver? (Не очень часто.)

Ситуация 2: вы CAN реалистично расширяете свой WebDriver.

Эта ситуация реже,, но, возможно, вы либо:
    (a)   Работа с хорошо продуманной и абстрактной структурой или
      (b)   Запуск рамки тестирования селена с нуля.

В этом случае вы можете создать свой собственный интерфейс, который расширяет WebDriver:

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}

И тогда вы можете распространять стандартные WebDrivers так (в этом примере, ChromeDriver):

public class CustomChromeDriver extends ChromeDriver implements CustomDriver {

    boolean hasQuit = false;

    @Override
    public boolean hasQuit() {
        return hasQuit;
    }

    @Override
    public void stopClient() {
        super.stopClient();
        hasQuit = true;
    }
}

Ответ 3

StopClient метод будет вызываться после quit (RemoteWebDriver Source), возможно, вы можете подклассифицировать свой экземпляр RemoteWebDriver и переопределить метод stopClient, установить некоторый флаг и проверить флаг, чтобы определить, закрыт ли webdriver (quit).