4343import java .time .format .DateTimeFormatter ;
4444import java .util .ArrayList ;
4545import java .util .Collections ;
46+ import java .util .HashMap ;
4647import java .util .LinkedHashMap ;
4748import java .util .List ;
4849import java .util .Map ;
4950import java .util .Optional ;
5051import java .util .concurrent .ConcurrentHashMap ;
52+ import java .util .stream .Collectors ;
5153import java .util .stream .Stream ;
5254
5355import org .apache .commons .io .IOUtils ;
5456import org .junit .jupiter .api .TestTemplate ;
5557import org .junit .jupiter .api .extension .AfterAllCallback ;
5658import org .junit .jupiter .api .extension .AfterEachCallback ;
5759import org .junit .jupiter .api .extension .AfterTestExecutionCallback ;
58- import org .junit .jupiter .api .extension .BeforeAllCallback ;
60+ import org .junit .jupiter .api .extension .BeforeEachCallback ;
5961import org .junit .jupiter .api .extension .ConditionEvaluationResult ;
6062import org .junit .jupiter .api .extension .ExecutionCondition ;
6163import org .junit .jupiter .api .extension .Extension ;
9294 * @author Boni Garcia
9395 * @since 1.0.0
9496 */
95- public class SeleniumJupiter implements BeforeAllCallback , ParameterResolver ,
97+ public class SeleniumJupiter implements BeforeEachCallback , ParameterResolver ,
9698 AfterTestExecutionCallback , AfterEachCallback , AfterAllCallback ,
9799 TestTemplateInvocationContextProvider , ExecutionCondition ,
98100 TestExecutionExceptionHandler , TestWatcher {
@@ -115,7 +117,7 @@ public class SeleniumJupiter implements BeforeAllCallback, ParameterResolver,
115117 .enabled ("Test enabled" );
116118
117119 Config config ;
118- Map <String , WdmTest > wdmMap ;
120+ Map <String , List < WebDriverManager > > wdmMap ;
119121 List <DevTools > devToolsList ;
120122 AnnotationsReader annotationsReader ;
121123 List <List <Browser >> browserListList ;
@@ -124,6 +126,7 @@ public class SeleniumJupiter implements BeforeAllCallback, ParameterResolver,
124126 URL urlFromAnnotation ;
125127 SelenideHandler selenideHandler ;
126128 ExtentReports report ;
129+ Map <String , ExtentTest > testMap ;
127130
128131 public SeleniumJupiter () {
129132 config = new Config ();
@@ -133,10 +136,11 @@ public SeleniumJupiter() {
133136 browserListMap = new ConcurrentHashMap <>();
134137 devToolsList = new ArrayList <>();
135138 selenideHandler = new SelenideHandler (annotationsReader );
139+ testMap = new HashMap <>();
136140 }
137141
138142 @ Override
139- public void beforeAll (ExtensionContext extensionContext ) throws Exception {
143+ public void beforeEach (ExtensionContext extensionContext ) throws Exception {
140144 Store store = extensionContext .getRoot ()
141145 .getStore (ExtensionContext .Namespace .create (STORE_NAMESPACE ));
142146 report = store .get (STORE_NAME , ExtentReports .class );
@@ -163,6 +167,9 @@ public void beforeAll(ExtensionContext extensionContext) throws Exception {
163167
164168 Runtime .getRuntime ().addShutdownHook (new Thread (report ::flush ));
165169 }
170+
171+ testMap .put (extensionContext .getUniqueId (),
172+ createExtentTest (report , extensionContext ));
166173 }
167174
168175 @ Override
@@ -240,9 +247,8 @@ private Object resolveSeleniumWebDriver(ExtensionContext extensionContext,
240247 .getCapabilities (parameter , testInstance );
241248 // Single session
242249 if (isSingleSession (extensionContext ) && wdmMap .containsKey (contextId )
243- && index < wdmMap .get (contextId ).getWdmList ().size ()) {
244- WebDriver driver = wdmMap .get (contextId ).getWdmList ().get (index )
245- .getWebDriver ();
250+ && index < wdmMap .get (contextId ).size ()) {
251+ WebDriver driver = wdmMap .get (contextId ).get (index ).getWebDriver ();
246252 if (driver != null ) {
247253 log .trace ("Returning driver at index {}: {}" , index , driver );
248254 return driver ;
@@ -334,8 +340,8 @@ private Optional<URL> findUrl(Parameter parameter,
334340
335341 private Object resolveDevTools (String contextId , int index ) {
336342 if (wdmMap != null && wdmMap .get (contextId ) != null
337- && wdmMap .get (contextId ).getWdmList (). size () >= index ) {
338- WebDriver driver = wdmMap .get (contextId ).getWdmList (). get (index - 1 )
343+ && wdmMap .get (contextId ).size () >= index ) {
344+ WebDriver driver = wdmMap .get (contextId ).get (index - 1 )
339345 .getWebDriver ();
340346 log .debug ("Opening DevTools for {}" , driver );
341347 DevTools devTools = ((HasDevTools ) driver ).getDevTools ();
@@ -532,18 +538,18 @@ private Optional<Capabilities> getCapabilities(
532538 public void afterTestExecution (ExtensionContext extensionContext )
533539 throws Exception {
534540 String contextId = getContextId (extensionContext );
535- ScreenshotManager screenshotManager = new ScreenshotManager (
536- extensionContext , getConfig (), outputHandler );
537-
538541 if (wdmMap .containsKey (contextId )) {
539- ExtentTest test = wdmMap .get (contextId ).getTest ();
540- wdmMap .get (contextId ).getWdmList ().forEach (wdm -> {
542+ Optional <ExtentTest > optionalTest = findTest (extensionContext );
543+ ScreenshotManager screenshotManager = new ScreenshotManager (
544+ extensionContext , getConfig (), outputHandler );
545+ wdmMap .get (contextId ).forEach (wdm -> {
541546 wdm .getWebDriverList ().forEach (driver -> screenshotManager
542- .makeScreenshotIfRequired (driver , test ));
547+ .makeScreenshotIfRequired (driver , optionalTest ));
543548 wdm .stopDockerRecording ();
544549 String recordingBase64 = wdm .getRecordingBase64 ();
545550 if (recordingBase64 != null && !recordingBase64 .isEmpty ()) {
546- test .addVideoFromBase64String (recordingBase64 );
551+ optionalTest .ifPresent (test -> test
552+ .addVideoFromBase64String (recordingBase64 ));
547553 }
548554 });
549555 }
@@ -812,13 +818,13 @@ private void putManagerInMap(ExtensionContext extensionContext,
812818 log .trace ("Put manager {} in map (context id {})" , wdm , contextId );
813819
814820 if (wdmMap .containsKey (contextId )) {
815- wdmMap .get (contextId ).getWdmList (). add (wdm );
821+ wdmMap .get (contextId ).add (wdm );
816822 log .trace ("Adding {} to existing map (id {})" , wdm , contextId );
817823 } else {
818- WdmTest wdmTest = new WdmTest ( report , extensionContext );
819- wdmTest . getWdmList () .add (wdm );
820- wdmMap .put (contextId , wdmTest );
821- log .trace ("Adding {} to new map (id {})" , wdmTest , contextId );
824+ List < WebDriverManager > wdmList = new ArrayList <>( );
825+ wdmList .add (wdm );
826+ wdmMap .put (contextId , wdmList );
827+ log .trace ("Adding {} to new map (id {})" , wdm , contextId );
822828 }
823829 }
824830
@@ -845,7 +851,7 @@ private void quitWebDriver(ExtensionContext extensionContext) {
845851 if (wdmMap .containsKey (contextId )) {
846852 Optional <Throwable > executionException = extensionContext
847853 .getExecutionException ();
848- wdmMap .get (contextId ).getWdmList (). forEach (wdm -> {
854+ wdmMap .get (contextId ).forEach (wdm -> {
849855 // Get recording files (to be deleted after quit)
850856 List <Path > recordingList = Collections .emptyList ();
851857 if (config .isRecordingWhenFailure ()
@@ -928,7 +934,7 @@ public <T> T invokeWdm(String method, Object... params) {
928934 try {
929935 if (!wdmMap .isEmpty ()) {
930936 List <WebDriverManager > wdmTestList = wdmMap .entrySet ()
931- .iterator ().next ().getValue (). getWdmList () ;
937+ .iterator ().next ().getValue ();
932938 WebDriverManager wdm = wdmTestList .get (0 );
933939 Method wdmMethod = (params .length == 0 )
934940 ? wdm .getClass ().getMethod (method )
@@ -947,8 +953,8 @@ public <T> T invokeWdm(WebDriver driver, String method, Object... params) {
947953 T out = null ;
948954 try {
949955 if (!wdmMap .isEmpty ()) {
950- for (WdmTest wdmTest : wdmMap .values ()) {
951- for (WebDriverManager wdm : wdmTest . getWdmList () ) {
956+ for (List < WebDriverManager > wdmList : wdmMap .values ()) {
957+ for (WebDriverManager wdm : wdmList ) {
952958 Method wdmMethod = (params .length == 0 )
953959 ? wdm .getClass ().getMethod (method )
954960 : wdm .getClass ().getMethod (method ,
@@ -969,32 +975,76 @@ public <T> T invokeWdm(WebDriver driver, String method, Object... params) {
969975 @ Override
970976 public void handleTestExecutionException (ExtensionContext extensionContext ,
971977 Throwable throwable ) throws Throwable {
972- String contextId = getContextId (extensionContext );
973- if (wdmMap .containsKey (contextId )) {
974- WdmTest wdmTest = wdmMap .get (contextId );
975- wdmTest .gatherBrowserData ();
976- ExtentTest test = wdmTest .getTest ();
978+ findTest (extensionContext ).ifPresent (test -> {
979+ gatherBrowserData (test , extensionContext );
977980 test .fail (throwable );
978- }
981+ });
979982 throw throwable ;
980983 }
981984
982985 @ Override
983986 public void testDisabled (ExtensionContext extensionContext ,
984987 Optional <String > reason ) {
985- String contextId = getContextId (extensionContext );
986- if (wdmMap .containsKey (contextId )) {
987- wdmMap .get (contextId ).getTest ()
988- .skip (reason .orElse ("Disabled test" ));
989- }
988+ findTest (extensionContext )
989+ .ifPresent (test -> test .skip (reason .orElse ("Disabled test" )));
990990 }
991991
992992 @ Override
993993 public void testAborted (ExtensionContext extensionContext ,
994994 Throwable cause ) {
995+ findTest (extensionContext ).ifPresent (test -> test .skip (cause ));
996+ }
997+
998+ private ExtentTest createExtentTest (ExtentReports report ,
999+ ExtensionContext context ) {
1000+ String displayName = context .getDisplayName ();
1001+ String testName = context .getTestClass ()
1002+ .map (testClass -> testClass .getSimpleName () + "." + displayName )
1003+ .orElse (displayName );
1004+ ExtentTest extentTest = report .createTest (testName );
1005+ context .getTags ().forEach (extentTest ::assignCategory );
1006+ return extentTest ;
1007+ }
1008+
1009+ private Optional <ExtentTest > findTest (ExtensionContext extensionContext ) {
1010+ Optional <ExtentTest > test = Optional .empty ();
1011+ String uniqueId = extensionContext .getUniqueId ();
1012+ if (testMap .containsKey (uniqueId )) {
1013+ test = Optional .of (testMap .get (uniqueId ));
1014+ }
1015+ return test ;
1016+ }
1017+
1018+ private void gatherBrowserData (ExtentTest test ,
1019+ ExtensionContext extensionContext ) {
9951020 String contextId = getContextId (extensionContext );
1021+ List <WebDriverManager > wdmList = wdmMap .get (contextId );
9961022 if (wdmMap .containsKey (contextId )) {
997- wdmMap .get (contextId ).getTest ().skip (cause );
1023+ for (WebDriverManager wdm : wdmList ) {
1024+ for (WebDriver driver : wdm .getWebDriverList ()) {
1025+ String driverInfo = driver .toString ();
1026+
1027+ // Screenshot
1028+ String base64Screenshot = ScreenshotManager
1029+ .getBase64Screenshot (driver );
1030+ test .addScreenCaptureFromBase64String (base64Screenshot ,
1031+ driverInfo );
1032+
1033+ // Logs
1034+ List <Map <String , Object >> logs = wdm .getLogs (driver );
1035+ if (logs != null && !logs .isEmpty ()) {
1036+ String logAsString = logs .stream ()
1037+ .map (entry -> String .format ("[%s] [%s] %s" ,
1038+ entry .get ("datetime" ),
1039+ entry .get ("type" ),
1040+ entry .get ("message" )))
1041+ .collect (Collectors
1042+ .joining (System .lineSeparator ()));
1043+ test .info (String .format (FORMATTED_INFO ,
1044+ driverInfo + " console" , logAsString ));
1045+ }
1046+ }
1047+ }
9981048 }
9991049 }
10001050
0 commit comments