View Javadoc

1   package com.atlassian.webdriver.utils;
2   
3   import org.apache.commons.io.IOUtils;
4   import org.openqa.selenium.JavascriptExecutor;
5   import org.openqa.selenium.WebDriver;
6   import org.openqa.selenium.WebElement;
7   
8   import java.io.IOException;
9   import java.io.InputStream;
10  
11  /**
12   * JavaScript Utilities for executing specific javascript events.
13   */
14  public class JavaScriptUtils
15  {
16  
17      private JavaScriptUtils() {}
18  
19      /**
20       * @deprecated Use {@link WebElementUtil#getInnerHtml(WebElement, WebDriver)}
21       */
22      @Deprecated
23      public static String innerHtml(WebElement element, WebDriver driver)
24      {
25          return WebElementUtil.getInnerHtml(element, driver);
26      }
27  
28  
29      public static void dispatchEvent(String eventType, WebElement element, WebDriver webDriver)
30      {
31          loadScript("js/atlassian/events/customevents.js", webDriver);
32          execute("ATLWD.events.fireEventForElement(arguments[0],'" + eventType + "');", webDriver, element);
33      }
34  
35      /**
36       * Dispatches a javascript mouse event in the browser on a specified element
37       *
38       * @param event The name of the event to dispatch. eg. load.
39       * @param el The element to fire the event on.
40       * @param driver the webdriver instance that executes the javascript event.
41       */
42      public static void dispatchMouseEvent(String event, WebElement el, WebDriver driver)
43      {
44          dispatchEvent(event, el, driver);
45      }
46  
47      /**
48       * Will load a javascript file from the class loader.
49       * @param jsScriptName the name of the javascipt file
50       * @param driver the webdriver to execute the javascript
51       * @return true if the file was loaded. false if it was already loaded.
52       */
53      public static boolean loadScript(String jsScriptName, WebDriver driver)
54      {
55          if (!isScriptLoaded(jsScriptName,driver))
56          {
57              doLoadScript(jsScriptName, driver, true);
58              return true;
59          }
60  
61          return false;
62      }
63  
64      public static boolean isScriptLoaded(String jsScriptName, WebDriver webDriver)
65      {
66          loadCoreScript(webDriver);
67          return execute(Boolean.class, "return window.ATLWD.scriptloader.isLoaded('" + jsScriptName + "');" , webDriver);
68      }
69  
70      private static void doLoadScript(String jsScriptName, WebDriver driver, boolean addToLoaded)
71      {
72          InputStream scriptStream = null;
73          try
74          {
75              scriptStream = loadResource(jsScriptName);
76              String jsSource = IOUtils.toString(scriptStream);
77              if (addToLoaded)
78              {
79                  jsSource = "window.ATLWD.scriptloader.scriptLoaded('" + jsScriptName + "');" + jsSource;
80              }
81              JavaScriptUtils.execute(jsSource, driver);
82          }
83          catch (IOException e)
84          {
85              throw new RuntimeException("Unable to load the javascript file: " + jsScriptName, e);
86          }
87          finally
88          {
89              IOUtils.closeQuietly(scriptStream);
90          }
91  
92      }
93  
94      private static void loadCoreScript(WebDriver webDriver)
95      {
96          if (Boolean.FALSE.equals(isCoreLoaded(webDriver)))
97          {
98              doLoadScript("js/atlassian/atlassian-webdriver-core.js", webDriver, false);
99              doLoadScript("js/atlassian/scriptloader/scriptloader.js", webDriver, false);
100             loadScript("js/jquery/jquery-1.4.2.min.js", webDriver);
101             execute("ATLWD.loadJquery()", webDriver);
102         }
103     }
104 
105     private static boolean isCoreLoaded(WebDriver webDriver)
106     {
107         return execute(Boolean.class, "return window.ATLWD != undefined && window.ATLWD.scriptloader != undefined", webDriver);
108     }
109 
110     private static InputStream loadResource(String jsScriptName)
111     {
112         InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(jsScriptName);
113         if (is == null) {
114             is = Thread.currentThread().getContextClassLoader().getResourceAsStream(jsScriptName);
115         }
116         if (is == null) {
117             throw new RuntimeException("javascript resource " + jsScriptName
118                     + " not found by system or context classloaders.");
119         }
120         return is;
121     }
122 
123     public static <T> T execute(String js, WebDriver driver, Object... arguments)
124     {
125         JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
126         return (T) jsExecutor.executeScript(js, arguments);
127     }
128 
129 
130     public static <T> T execute(Class<T> expectedReturn, String js, WebDriver driver, Object... arguments)
131     {
132         JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
133         final Object result = jsExecutor.executeScript(js, arguments);
134         if (result != null && !expectedReturn.isInstance(result))
135         {
136             throw new ClassCastException("Expected result type " + expectedReturn.getName() + " but was: "
137                     + result.getClass().getName());
138         }
139         return expectedReturn.cast(result);
140     }
141 }