1 package com.atlassian.webdriver.testing.rule;
2
3 import com.atlassian.webdriver.browsers.WebDriverBrowserAutoInstall;
4 import com.google.common.base.Supplier;
5 import com.google.common.base.Suppliers;
6 import org.junit.rules.TestWatcher;
7 import org.junit.runner.Description;
8 import org.openqa.selenium.WebDriver;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11
12 import javax.inject.Inject;
13
14 import static com.google.common.base.Preconditions.checkNotNull;
15
16
17
18
19
20
21
22 public final class LogPageSourceRule extends TestWatcher
23 {
24 private static final Logger DEFAULT_LOGGER = LoggerFactory.getLogger(LogPageSourceRule.class);
25
26 private static final String ENABLE_LOG_KEY = "atlassian.test.logSourceOnFailure";
27
28 private final Logger logger;
29 private final Supplier<? extends WebDriver> webDriver;
30
31 @Inject
32 public LogPageSourceRule(WebDriver webDriver, Logger logger)
33 {
34 this(Suppliers.ofInstance(checkNotNull(webDriver, "webDriver")),logger);
35 }
36
37 public LogPageSourceRule(Supplier<? extends WebDriver> webDriver, Logger logger)
38 {
39 this.webDriver = checkNotNull(webDriver, "webDriver");
40 this.logger = checkNotNull(logger, "logger");
41 }
42
43 public LogPageSourceRule(Logger logger)
44 {
45 this(WebDriverBrowserAutoInstall.driverSupplier(), logger);
46 }
47
48 public LogPageSourceRule()
49 {
50 this(DEFAULT_LOGGER);
51 }
52
53
54
55
56
57
58
59 public LogPageSourceRule logger(Logger logger)
60 {
61 return new LogPageSourceRule(this.webDriver, logger);
62 }
63
64 @Override
65 public void failed(final Throwable e, final Description description)
66 {
67 if (!logPageSourceEnabled())
68 {
69 return;
70 }
71 logger.info("----- Test '{}' Failed. ", description.getMethodName());
72 logger.info("----- START PAGE SOURCE DUMP\n\n\n{}\n\n\n", webDriver.get().getPageSource());
73 logger.info("----- END PAGE SOURCE DUMP");
74 }
75
76 private boolean logPageSourceEnabled()
77 {
78 return Boolean.TRUE.toString().equals(System.getProperty(ENABLE_LOG_KEY));
79 }
80 }