View Javadoc
1   package net.avcompris.guixer.core;
2   
3   import static com.google.common.base.Preconditions.checkNotNull;
4   import static com.google.common.base.Preconditions.checkState;
5   import static net.avcompris.commons3.it.utils.IntegrationTestUtils.getTestProperty;
6   import static org.apache.commons.lang3.StringUtils.substringBetween;
7   
8   import java.io.File;
9   import java.lang.annotation.Annotation;
10  import java.net.URL;
11  
12  import org.apache.commons.lang3.NotImplementedException;
13  import org.junit.jupiter.api.AfterEach;
14  import org.junit.jupiter.api.BeforeEach;
15  import org.openqa.selenium.Capabilities;
16  import org.openqa.selenium.WebDriver;
17  import org.openqa.selenium.WebDriverException;
18  import org.openqa.selenium.remote.DesiredCapabilities;
19  import org.openqa.selenium.remote.RemoteWebDriver;
20  
21  public abstract class AbstractUITest extends MyAbstractUITestCommandImpl {
22  
23  	private WebDriver driver;
24  	private String baseURL;
25  	private static final Contextext.html#Context">Context context = new Context(new File("target/ui-it-results"));
26  
27  	protected AbstractUITest() {
28  
29  		super(context);
30  	}
31  
32  	protected final WebDriver getDriver() {
33  
34  		final WebDriver driverCopy = driver;
35  
36  		checkState(driverCopy != null, "driver should have been set");
37  
38  		return driverCopy;
39  	}
40  
41  	protected final String getBaseURL() {
42  
43  		final String baseURLCopy = baseURL;
44  
45  		checkState(baseURLCopy != null, "baseURL should have been set");
46  
47  		return baseURLCopy;
48  	}
49  
50  	@BeforeEach
51  	public final void setUpFirefox() throws Exception {
52  
53  		final String seleniumServerURL = getTestProperty("selenium.server.url");
54  		final String seleniumDesiredCapabilities = getTestProperty("selenium.desiredCapabilities");
55  
56  		System.out.println("selenium.server.url: " + seleniumServerURL);
57  		System.out.println("selenium.desiredCapabilities: " + seleniumDesiredCapabilities);
58  
59  		context.setSeleniumServerURL(seleniumServerURL);
60  		context.setSeleniumDesiredCapabilities(seleniumDesiredCapabilities);
61  
62  		final Capabilities capabilities;
63  
64  		if ("firefox".contentEquals(seleniumDesiredCapabilities)) {
65  			capabilities = DesiredCapabilities.firefox();
66  		} else if ("chrome".contentEquals(seleniumDesiredCapabilities)) {
67  			capabilities = DesiredCapabilities.chrome();
68  		} else {
69  			throw new NotImplementedException("selenium.desiredCapabilities: " + seleniumDesiredCapabilities);
70  		}
71  
72  		driver = new RemoteWebDriver(new URL(seleniumServerURL), capabilities);
73  	}
74  
75  	@AfterEach
76  	public final void tearDownFirefox() throws Exception {
77  
78  		if (driver != null) {
79  
80  			try {
81  
82  				driver.quit();
83  
84  			} catch (final WebDriverException e) {
85  
86  				// Sometimes, "driver.quit()" just crashes.
87  				//
88  				e.printStackTrace(); // log the error, and do nothing
89  			}
90  
91  			driver = null;
92  		}
93  	}
94  
95  	@BeforeEach
96  	public final void setUpContext() throws Exception {
97  
98  		context.reset(Long.toString(System.currentTimeMillis()));
99  
100 		final String oldBaseURL = baseURL;
101 
102 		final Class<? extends AbstractUITest> testClass = this.getClass();
103 
104 		String baseURL = extractAnnotation(testClass, UIEnv.class).baseURL();
105 
106 		if (baseURL.startsWith("${")) {
107 
108 			baseURL = getTestProperty(substringBetween(baseURL, "${", "}"));
109 		}
110 
111 		if (oldBaseURL == null || !baseURL.contentEquals(oldBaseURL)) {
112 
113 			System.out.println("baseURL: " + baseURL);
114 		}
115 
116 		this.baseURL = baseURL;
117 
118 		context.setBaseURL(baseURL);
119 	}
120 
121 	@AfterEach
122 	public final void tearDownContext() throws Exception {
123 
124 		context.close();
125 	}
126 
127 	private <T extends Annotation> T extractAnnotation(final Class<?> clazz, final Class<T> annotationClass) {
128 
129 		checkNotNull(clazz, "clazz");
130 		checkNotNull(annotationClass, "annotationClass");
131 
132 		final T annotation = clazz.getAnnotation(annotationClass);
133 
134 		if (annotation != null) {
135 			return annotation;
136 		}
137 
138 		final Class<?> superClass = clazz.getSuperclass();
139 
140 		if (superClass == null) {
141 			throw new RuntimeException("Cannot find annotation: @" + annotationClass.getSimpleName() + ", on class: "
142 					+ this.getClass().getName());
143 		}
144 
145 		return extractAnnotation(superClass, annotationClass);
146 	}
147 }