Что я делаю
Я пытаюсь запустить параллельный тест java selenium-webdriver с Selenium-Grid, который был интегрирован в selenium-server-standalone-2.47.1.jar
. Я намерен запустить несколько экземпляров Firefox для одновременного выполнения разных задач. Кстати, я не буду использовать TesgNG или JUnit.
Что я сделал
Удобно для вас, ребята, я предоставлю только часть своего кода.
У меня есть преобразователь Firefox здесь.
public class FirefoxResolver implements Resolver{
WebDriver driver;
@Override
public void connectHub() {
DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setBrowserName("firefox");
dc.setPlatform(Platform.WINDOWS);
try {
URL url = new URL(BrowserFactory.HUB); //Here I am sure I connect to a correct hub
driver = new RemoteWebDriver(url, dc);
} catch(ANYEXCEPTION HERE) {
}
@Override
public WebDriver getDriver() {
return driver;
}
}
И вот у меня есть Main Runnable
public class MainRunner implements Runnable{
@Override
public void run() {
Resolver r = BrowserFactory.getInstance().getBrowserResolver(
browser);
r.connectHub();
driver = r.getDriver();
/************************************************
Use driver to do something then.
/************************************************
**Finally here I use a driver.quit() to shutdown the driver created in current thread. I have also tried driver.close()**
}
}
После запуска мой основной процессор запустит новый поток для запуска MainRunner. Я отладил и обнаружил, что на самом деле сгенерированы разные экземпляры «драйвера».
Также я провел исследование:
Вам следует использовать Selenium Grid, если вы хотите выполнить одно или оба из следующих действий:
Запускайте тесты в разных браузерах, операционных системах и машинах одновременно. Это гарантирует, что тестируемое приложение будет полностью совместимо с широким спектром комбинаций ОС браузера.
Экономьте время при выполнении наборов тестов. Если вы настроите Selenium Grid на выполнение, скажем, 4 тестов одновременно, вы сможете завершить весь набор примерно в 4 раза быстрее.
Проблема
Когда я одновременно запускал два случая с помощью Firefox, они, похоже, используют один и тот же сеанс и взаимодействуют друг с другом. Разворачиваю ли я узел на другой машине или нет. Ни одно из дел не увенчалось успехом. Кажется, что если один из кейсов завершился и вызывает driver.quit()
или driver.close()
, другой не может продолжать выполнение. Вот информация о трассировке стека, если я использую driver.close()
:
Исключение в потоке "Thread-26" org.openqa.selenium.WebDriverException: ошибка связи с удаленным браузером. Возможно, оно умерло.
Информация о сборке: версия: «2.47.1», ревизия: «411b314», время: «2015-07-30 03:03:16» Информация о системе: хост: «J.Lyu», ip: «192.168.6.71», os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21'
Информация о драйвере: driver.version: EventFiringWebDriver
Продолжительность команды или время ожидания: 1,51 секунды
Информация о сборке: версия: «2.47.1», ревизия: «неизвестно», время: «2015-07-30 11:02:44» Информация о системе: хост: «J.Lyu», ip: «192.168.6.71», os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Идентификатор сеанса: 2b73c6e8-f601-4259-9646-9a53241fe074 Информация о драйвере: org Возможности .openqa.selenium.remote.RemoteWebDriver [{platform=WINDOWS, javascriptEnabled=true, acceptSslCerts=true, browserName=firefox, rotatable=false, locationContextEnabled=true, webdriver.remote.sessionid=2b73c6e8-f601-4259-9646-9a53241fe074 , version=40.0.3, databaseEnabled=true, cssSelectorsEnabled=true, handlesAlerts=true, webStorageEnabled=true, nativeEvents=false, applicationCacheEnabled=true, takeScreenshot=true}]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor .newInstance(Constructor.java:525) в org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) в org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
на org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) на org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:618) на org.openqa.selenium.remote.RemoteWebDriver.close (RemoteWebDriver.java:459) на com.milanoo.qa.runtime.module.MainRunner.run(MainRunner.java:167) на java.lang.Thread.run(Thread.java:722)
Причина: org.openqa.selenium.remote.UnreachableBrowserException: ошибка связи с удаленным браузером. Возможно, оно умерло. Информация о сборке: версия: «2.47.1», ревизия: «411b314», время: «2015-07-30 03:03:16» Информация о системе: хост: «J.Lyu», ip: «192.168.6.71», os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Информация о драйвере: driver.version: EventFiringWebDriver Информация о сборке: версия: '2.47. 1", ревизия: "неизвестно", время: "2015-07-30 11:02:44" Информация о системе: хост: "J.Lyu", ip: "192.168.6.71", os.name: "Windows 7" , os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21' Информация о драйвере: driver.version: неизвестно
Может ли кто-нибудь помочь с этим? Большое спасибо, и если вы хотите получить дополнительную информацию, пожалуйста, дайте мне знать.
Обновление 12.10.2015, 11:51
Я пробовал это, даже если я не использую какую-либо команду выключения (закрыть или удалить), проблема все еще существует.
Я проверил сообщение журнала концентратора, а затем обнаружил, что более позднее выполненное всегда будет успешным, а более раннее - неудачным (независимо от того, запускаю ли я только один узел или два узла И находятся ли они на разных машинах (VM или RM)). Кажется, что-то, связанное с более ранним, было покрыто более поздним. Но до сих пор он не выдал никаких исключений. Предыдущий просто заблокировал.