В 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 после завершения (что я не обязательно контролирую).
Ответы
Ответ 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
).