1919import java .lang .invoke .MethodHandles ;
2020import java .lang .reflect .InvocationTargetException ;
2121import java .lang .reflect .Method ;
22+ import java .util .ArrayList ;
2223import java .util .Arrays ;
24+ import java .util .HashSet ;
2325import java .util .List ;
2426import java .util .Map ;
2527import java .util .Optional ;
2628import java .util .Set ;
2729import java .util .concurrent .ConcurrentHashMap ;
30+ import java .util .concurrent .TimeUnit ;
2831import java .util .concurrent .atomic .AtomicReference ;
2932import java .util .regex .Matcher ;
3033import java .util .regex .Pattern ;
34+ import java .util .stream .Collectors ;
3135
3236import javax .xml .parsers .DocumentBuilder ;
3337import javax .xml .parsers .DocumentBuilderFactory ;
3438
3539import com .zebrunner .agent .core .config .provider .SystemPropertiesConfigurationProvider ;
3640import com .zebrunner .agent .core .webdriver .CapabilitiesCustomizerChain ;
41+ import com .zebrunner .carina .webdriver .IDriverPool ;
3742import com .zebrunner .carina .webdriver .core .capability .CarinaCapabilitiesCustomizer ;
3843import org .apache .commons .lang3 .StringUtils ;
3944import org .apache .commons .lang3 .reflect .ConstructorUtils ;
45+ import org .apache .commons .lang3 .tuple .ImmutablePair ;
46+ import org .apache .commons .lang3 .tuple .Pair ;
4047import org .apache .logging .log4j .Level ;
4148import org .apache .logging .log4j .LogManager ;
4249import org .apache .logging .log4j .core .LoggerContext ;
@@ -757,7 +764,7 @@ private void attachTestRunLabels(ISuite suite) {
757764 *
758765 */
759766 private void takeScreenshot () {
760- ConcurrentHashMap <String , CarinaDriver > drivers = getDrivers ();
767+ Map <String , CarinaDriver > drivers = IDriverPool . getDrivers ();
761768 try {
762769 for (Map .Entry <String , CarinaDriver > entry : drivers .entrySet ()) {
763770 WebDriver drv = entry .getValue ().getDriver ();
@@ -772,30 +779,26 @@ public static class ShutdownHook extends Thread {
772779
773780 private static final Logger LOGGER = LoggerFactory .getLogger (ShutdownHook .class );
774781
775- private void quitAllDriversOnHook () {
776- // as it is shutdown hook just try to quit all existing drivers one by one
777- for (CarinaDriver carinaDriver : driversPool ) {
778- // it is expected that all drivers are killed in appropriate AfterMethod/Class/Suite blocks
779- String name = carinaDriver .getName ();
780- LOGGER .warn ("Trying to quit driver '{}' on shutdown hook action!" , name );
781- carinaDriver .getDevice ().disconnectRemote ();
782- try {
783- LOGGER .debug ("Driver closing...{}" , name );
784- carinaDriver .getDriver ().close ();
785- LOGGER .debug ("Driver exiting...{}" , name );
786- carinaDriver .getDriver ().quit ();
787- LOGGER .debug ("Driver exited...{}" , name );
788- } catch (Exception e ) {
789- // do nothing
790- }
782+ private void quitAllDriversOnHook () throws InterruptedException {
783+ List <ImmutablePair <Long , String >> drivers4Close = new ArrayList <>();
784+ for (Map <String , CarinaDriver > drivers : IDriverPool .DRIVERS_POOL .values ()) {
785+ drivers .keySet ().forEach (key -> drivers4Close .add (new ImmutablePair <>(drivers .get (key ).getThreadId (), key )));
791786 }
787+ drivers4Close .forEach (driver -> IDriverPool .quitDriver (driver .getRight (), driver .getLeft ()));
788+ IDriverPool .EXECUTOR_SERVICE .shutdown ();
789+
790+ IDriverPool .EXECUTOR_SERVICE .awaitTermination (10 , TimeUnit .MINUTES );
792791 }
793792
794793 @ Override
795794 public void run () {
796795 LOGGER .debug ("Running shutdown hook" );
797796 if (!Configuration .get (TestConfiguration .Parameter .FORCIBLY_DISABLE_DRIVER_QUIT , Boolean .class ).orElse (false )) {
798- quitAllDriversOnHook ();
797+ try {
798+ quitAllDriversOnHook ();
799+ } catch (InterruptedException e ) {
800+ throw new RuntimeException (e );
801+ }
799802 }
800803 }
801804
0 commit comments