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
13
14 public class JavaScriptUtils
15 {
16
17 private JavaScriptUtils() {}
18
19
20
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
37
38
39
40
41
42 public static void dispatchMouseEvent(String event, WebElement el, WebDriver driver)
43 {
44 dispatchEvent(event, el, driver);
45 }
46
47
48
49
50
51
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 }