View Javadoc

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   * Similarly to {@link com.atlassian.webdriver.testing.rule.WebDriverScreenshotRule}, this rule will
18   * dump page source directly to the log upon test failure.
19   *
20   * @since 2.1
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       * Returns a copy of this rule, specifying a different logger than the default.
55       * @param logger  a {@link Logger}
56       * @return  a new LogPageSourceRule based on the current instance
57       * @since 2.3
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  }