Помогите, один из 5 тестов падает, причем рандомно, как это решить?

Периодически один из 5-10 тестов падает (падает совсем рандомно, не вижу никакой зависимости) в логах выдает:

org.openqa.selenium.WebDriverException: Timed out waiting for driver server to start.
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'jenkins-fin', ip: '10.0.1.9', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.0-12-amd64', java.version: '1.8.0_192'
Driver info: driver.version: Driver
	at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:202)
	at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:188)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:79)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
	at Driver.Driver.<init>(Driver.java:26)
	at Driver.ObjectManager.<init>(ObjectManager.java:33)
	at com.xxx.BaseTest.SetUp(BaseTest.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
	at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:63)
	at org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:348)
	at org.testng.internal.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:302)
	at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:176)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.testng.TestRunner.privateRun(TestRunner.java:766)
	at org.testng.TestRunner.run(TestRunner.java:587)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
	at org.testng.SuiteRunner.run(SuiteRunner.java:286)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
	at org.testng.TestNG.runSuites(TestNG.java:1039)
	at org.testng.TestNG.run(TestNG.java:1007)
	at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:283)
	at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)
	at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:120)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:377)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:138)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:465)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:451)
Caused by: org.openqa.selenium.net.UrlChecker$TimeoutException: Timed out waiting for [http://localhost:12616/status] to be available after 20025 ms
	at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:100)
	at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:197)
	... 41 more
Caused by: java.util.concurrent.TimeoutException
	at java.util.concurrent.FutureTask.get(FutureTask.java:205)
	at com.google.common.util.concurrent.SimpleTimeLimiter.callWithTimeout(SimpleTimeLimiter.java:156)
	at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:75)

Может кто-то сталкивался с такой проблемой, буду очень благодарен)

Попробуйте увеличить command таймаут https://www.selenium.dev/selenium/docs/api/dotnet/html/M_OpenQA_Selenium_Chrome_ChromeDriver__ctor_7.htm если не поможет возможно у вас что-то не так с параллельностью или запуском и завершением сессии

404 на ссылке(

Проблема в этой строчке

Поправил

думаю скорее здесь
at Driver.Driver.(Driver.java:26)
это строка - инициализация драйвера
и да, извините за то что упустил важное уточнение, падает всегда на сетапе, происходит это во время инициализации драйвера, сейчас попробую увеличить command таймаут как предложили выше

public Driver() {
    setPropertyDependsOnOS();
    log = LogManager.getLogger(getClass().getName());
    webDriver = new ChromeDriver(setOptionDependOnOS() );
    webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    webDriver.manage().window().maximize();
}

public String setPropertyDependsOnOS() {
    if (System.getProperty("os.name").toLowerCase().contains("mac")) {
        return System.setProperty("webdriver.chrome.driver", "driverFolder/chromedriver");
    } else {
        return System.setProperty("webdriver.chrome.driver", "driverFolder/chromedriverLinux");
    }
}

public ChromeOptions setOptionDependOnOS() {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("enable-automation");
    options.addArguments("--headless");
    options.addArguments("window-size=1024,768");
    options.addArguments("--disable-extensions");
    options.addArguments("--dns-prefetch-disable");
    options.addArguments("--disable-gpu");
    options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
    return options;
}

вот код инициализации драйвера, возможно здесь что-то не так
падает на вот этой строке - webDriver = new ChromeDriver(setOptionDependOnOS() );

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

1 лайк

Да, скорее всего дело в этом.
Но опять таки скорее всего, архитектура тестов у большинства людей составлена так, что драйвер инициализируется каждый раз. Поэтому его придется закрывать каждый раз. Либо через Quit(), либо через Dispose(). Удобнее всего это повесить на биндинг или как там это в Джава называется, который запускается после каждого теста

И это плохая практика. Если можно выполнять тесты с одним экземпляров вебдрайвера, лучше делать так. Ибо большая нагрузка на систему, при каждой инициализации + тесты дольше выполняются

Ну хз хз :slight_smile:
Это вечная тема. Но с использованием Selenoid лучше всё же 1 браузер на 1 тест.
Но каждому своё, конечно. Кому-то важнее за прогон сэкономить 10 секунд в общей сложности, а кому-то immutable окружения в каждом тесте.

2 лайка

Один браузер на все тесты во-первых не даст гарантии того, что весь кэш вычистится правильно, данные корректно обновятся. А во-вторых, (что связано с первым), это не в полной мере воспроизведет поведение пользователя. Хотя, конечно же, это зависит от приложения.
В моем случае я отказался от практики одного браузера. И у меня это оправдано. Но для некоторых приложений такой подход, конечно же, будет предпочтительнее.

В этом есть тоже своя логика

1 лайк