PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/java/client/test/org/openqa/selenium/support/events/EventFiringWebDriverTest.java

https://bitbucket.org/abahdanovich/selenium
Java | 406 lines | 312 code | 70 blank | 24 comment | 3 complexity | e784f141d987411a49eec32b9a21951d MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, AGPL-1.0, MIT, Apache-2.0, BSD-3-Clause, GPL-2.0
  1. /*
  2. Copyright 2007-2009 Selenium committers
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package org.openqa.selenium.support.events;
  14. import static org.junit.Assert.assertEquals;
  15. import static org.junit.Assert.fail;
  16. import org.openqa.selenium.By;
  17. import org.openqa.selenium.JavascriptExecutor;
  18. import org.openqa.selenium.testing.MockTestBase;
  19. import org.openqa.selenium.NoSuchElementException;
  20. import org.openqa.selenium.StubDriver;
  21. import org.openqa.selenium.StubElement;
  22. import org.openqa.selenium.WebDriver;
  23. import org.openqa.selenium.WebDriver.Navigation;
  24. import org.openqa.selenium.WebElement;
  25. import org.openqa.selenium.internal.WrapsDriver;
  26. import org.openqa.selenium.internal.WrapsElement;
  27. import org.jmock.Expectations;
  28. import org.junit.Test;
  29. import java.util.ArrayList;
  30. import java.util.HashMap;
  31. import java.util.List;
  32. import java.util.Map;
  33. /**
  34. * @author Michael Tamm
  35. */
  36. public class EventFiringWebDriverTest extends MockTestBase {
  37. @Test
  38. public void navigationEvents() {
  39. final WebDriver mockedDriver = mock(WebDriver.class);
  40. final Navigation mockedNavigation = mock(Navigation.class);
  41. final StringBuilder log = new StringBuilder();
  42. checking(new Expectations() {{
  43. one(mockedDriver).get("http://www.get.com");
  44. exactly(3).of(mockedDriver).navigate();
  45. will(returnValue(mockedNavigation));
  46. one(mockedNavigation).to("http://www.navigate-to.com");
  47. one(mockedNavigation).back();
  48. one(mockedNavigation).forward();
  49. }});
  50. EventFiringWebDriver testedDriver =
  51. new EventFiringWebDriver(mockedDriver).register(new AbstractWebDriverEventListener() {
  52. @Override
  53. public void beforeNavigateTo(String url, WebDriver driver) {
  54. log.append("beforeNavigateTo ").append(url).append("\n");
  55. }
  56. @Override
  57. public void afterNavigateTo(String url, WebDriver driver) {
  58. log.append("afterNavigateTo ").append(url).append("\n");
  59. }
  60. @Override
  61. public void beforeNavigateBack(WebDriver driver) {
  62. log.append("beforeNavigateBack\n");
  63. }
  64. @Override
  65. public void afterNavigateBack(WebDriver driver) {
  66. log.append("afterNavigateBack\n");
  67. }
  68. @Override
  69. public void beforeNavigateForward(WebDriver driver) {
  70. log.append("beforeNavigateForward\n");
  71. }
  72. @Override
  73. public void afterNavigateForward(WebDriver driver) {
  74. log.append("afterNavigateForward\n");
  75. }
  76. });
  77. testedDriver.get("http://www.get.com");
  78. testedDriver.navigate().to("http://www.navigate-to.com");
  79. testedDriver.navigate().back();
  80. testedDriver.navigate().forward();
  81. assertEquals(
  82. "beforeNavigateTo http://www.get.com\n" +
  83. "afterNavigateTo http://www.get.com\n" +
  84. "beforeNavigateTo http://www.navigate-to.com\n" +
  85. "afterNavigateTo http://www.navigate-to.com\n" +
  86. "beforeNavigateBack\n" +
  87. "afterNavigateBack\n" +
  88. "beforeNavigateForward\n" +
  89. "afterNavigateForward\n",
  90. log.toString());
  91. }
  92. @Test
  93. public void clickEvent() {
  94. final WebDriver mockedDriver = mock(WebDriver.class);
  95. final WebElement mockedElement = mock(WebElement.class);
  96. final StringBuilder log = new StringBuilder();
  97. checking(new Expectations() {{
  98. one(mockedDriver).findElement(By.name("foo"));
  99. will(returnValue(mockedElement));
  100. one(mockedElement).click();
  101. }});
  102. EventFiringWebDriver testedDriver =
  103. new EventFiringWebDriver(mockedDriver).register(new AbstractWebDriverEventListener() {
  104. @Override
  105. public void beforeClickOn(WebElement element, WebDriver driver) {
  106. log.append("beforeClickOn\n");
  107. }
  108. @Override
  109. public void afterClickOn(WebElement element, WebDriver driver) {
  110. log.append("afterClickOn\n");
  111. }
  112. });
  113. testedDriver.findElement(By.name("foo")).click();
  114. assertEquals(
  115. "beforeClickOn\n" +
  116. "afterClickOn\n",
  117. log.toString());
  118. }
  119. @Test
  120. public void changeValueEvent() {
  121. final WebDriver mockedDriver = mock(WebDriver.class);
  122. final WebElement mockedElement = mock(WebElement.class);
  123. final StringBuilder log = new StringBuilder();
  124. checking(new Expectations() {{
  125. exactly(3).of(mockedDriver).findElement(By.name("foo"));
  126. will(returnValue(mockedElement));
  127. one(mockedElement).clear();
  128. one(mockedElement).sendKeys("some text");
  129. one(mockedElement).click();
  130. }});
  131. EventFiringWebDriver testedDriver =
  132. new EventFiringWebDriver(mockedDriver).register(new AbstractWebDriverEventListener() {
  133. @Override
  134. public void beforeChangeValueOf(WebElement element, WebDriver driver) {
  135. log.append("beforeChangeValueOf\n");
  136. }
  137. @Override
  138. public void afterChangeValueOf(WebElement element, WebDriver driver) {
  139. log.append("afterChangeValueOf\n");
  140. }
  141. });
  142. testedDriver.findElement(By.name("foo")).clear();
  143. testedDriver.findElement(By.name("foo")).sendKeys("some text");
  144. testedDriver.findElement(By.name("foo")).click();
  145. assertEquals(
  146. "beforeChangeValueOf\n" +
  147. "afterChangeValueOf\n" +
  148. "beforeChangeValueOf\n" +
  149. "afterChangeValueOf\n",
  150. log.toString());
  151. }
  152. @Test
  153. public void findByEvent() {
  154. final WebDriver mockedDriver = mock(WebDriver.class);
  155. final WebElement mockedElement = mock(WebElement.class);
  156. final StringBuilder log = new StringBuilder();
  157. checking(new Expectations() {{
  158. one(mockedDriver).findElement(By.id("foo"));
  159. will(returnValue(mockedElement));
  160. one(mockedElement).findElement(By.linkText("bar"));
  161. one(mockedElement).findElements(By.name("xyz"));
  162. one(mockedDriver).findElements(By.xpath("//link[@type = 'text/css']"));
  163. }});
  164. EventFiringWebDriver testedDriver =
  165. new EventFiringWebDriver(mockedDriver).register(new AbstractWebDriverEventListener() {
  166. @Override
  167. public void beforeFindBy(By by, WebElement element, WebDriver driver) {
  168. log.append("beforeFindBy from ").append(element == null ? "WebDriver" : "WebElement")
  169. .append(" ").append(by).append("\n");
  170. }
  171. @Override
  172. public void afterFindBy(By by, WebElement element, WebDriver driver) {
  173. log.append("afterFindBy from ").append(element == null ? "WebDriver" : "WebElement")
  174. .append(" ").append(by).append("\n");
  175. }
  176. });
  177. WebElement element = testedDriver.findElement(By.id("foo"));
  178. element.findElement(By.linkText("bar"));
  179. element.findElements(By.name("xyz"));
  180. testedDriver.findElements(By.xpath("//link[@type = 'text/css']"));
  181. assertEquals(
  182. "beforeFindBy from WebDriver By.id: foo\n" +
  183. "afterFindBy from WebDriver By.id: foo\n" +
  184. "beforeFindBy from WebElement By.linkText: bar\n" +
  185. "afterFindBy from WebElement By.linkText: bar\n" +
  186. "beforeFindBy from WebElement By.name: xyz\n" +
  187. "afterFindBy from WebElement By.name: xyz\n" +
  188. "beforeFindBy from WebDriver By.xpath: //link[@type = 'text/css']\n" +
  189. "afterFindBy from WebDriver By.xpath: //link[@type = 'text/css']\n",
  190. log.toString());
  191. }
  192. @Test
  193. public void shouldCallListenersWhenAnExceptionIsThrown() {
  194. final WebDriver mockedDriver = mock(WebDriver.class);
  195. final StringBuilder log = new StringBuilder();
  196. final NoSuchElementException exception = new NoSuchElementException("argh");
  197. checking(new Expectations() {{
  198. one(mockedDriver).findElement(By.id("foo"));
  199. will(throwException(exception));
  200. }});
  201. EventFiringWebDriver testedDriver =
  202. new EventFiringWebDriver(mockedDriver).register(new AbstractWebDriverEventListener() {
  203. @Override
  204. public void onException(Throwable throwable, WebDriver driver) {
  205. log.append(throwable.getMessage());
  206. }
  207. });
  208. try {
  209. testedDriver.findElement(By.id("foo"));
  210. fail("Expected exception to be propogated");
  211. } catch (NoSuchElementException e) {
  212. // Fine
  213. }
  214. assertEquals(exception.getMessage(), log.toString());
  215. }
  216. @Test
  217. public void shouldUnpackElementArgsWhenCallingScripts() {
  218. final ExececutingDriver mockedDriver = mock(ExececutingDriver.class);
  219. final WebElement stubbedElement = mock(WebElement.class);
  220. checking(new Expectations() {{
  221. one(mockedDriver).findElement(By.id("foo"));
  222. will(returnValue(stubbedElement));
  223. allowing(stubbedElement);
  224. one(mockedDriver).executeScript("foo", stubbedElement);
  225. will(returnValue("foo"));
  226. }});
  227. EventFiringWebDriver testedDriver = new EventFiringWebDriver(mockedDriver);
  228. testedDriver.register(new AbstractWebDriverEventListener() {});
  229. WebElement element = testedDriver.findElement(By.id("foo"));
  230. try {
  231. testedDriver.executeScript("foo", element);
  232. } catch (RuntimeException e) {
  233. // This is the error we're trying to fix
  234. throw e;
  235. }
  236. }
  237. @Test
  238. public void testShouldUnpackListOfElementArgsWhenCallingScripts() {
  239. final ExececutingDriver mockedDriver = mock(ExececutingDriver.class);
  240. final List<Object> aList = mock(List.class);
  241. checking(new Expectations() {{
  242. one(aList).size();
  243. one(mockedDriver).executeScript("foo", new Object[] {new ArrayList<Object>()});
  244. }});
  245. EventFiringWebDriver testedDriver = new EventFiringWebDriver(mockedDriver);
  246. testedDriver.register(new AbstractWebDriverEventListener() {});
  247. try {
  248. testedDriver.executeScript("foo", aList);
  249. } catch (RuntimeException e) {
  250. // This is the error we're trying to fix
  251. throw e;
  252. }
  253. }
  254. @Test
  255. public void testShouldUnpackMapOfElementArgsWhenCallingScripts() {
  256. final ExececutingDriver mockedDriver = mock(ExececutingDriver.class);
  257. final Map<Object, Object> aMap = mock(Map.class);
  258. checking(new Expectations() {{
  259. one(aMap).keySet();
  260. one(mockedDriver).executeScript("foo", new Object[] {new HashMap<Object, Object>()});
  261. }});
  262. EventFiringWebDriver testedDriver = new EventFiringWebDriver(mockedDriver);
  263. testedDriver.register(new AbstractWebDriverEventListener() {});
  264. try {
  265. testedDriver.executeScript("foo", aMap);
  266. } catch (RuntimeException e) {
  267. // This is the error we're trying to fix
  268. throw e;
  269. }
  270. }
  271. @Test
  272. public void shouldBeAbleToWrapSubclassesOfSomethingImplementingTheWebDriverInterface() {
  273. try {
  274. new EventFiringWebDriver(new ChildDriver());
  275. // We should get this far
  276. } catch (ClassCastException e) {
  277. e.printStackTrace();
  278. fail("Should have been able to wrap the child of a webdriver implementing interface");
  279. }
  280. }
  281. @Test
  282. public void shouldBeAbleToAccessWrappedInstanceFromEventCalls() {
  283. class MyStub extends StubDriver {
  284. @Override
  285. public void get(String url) {
  286. // Do nothing
  287. }
  288. @SuppressWarnings("unused")
  289. public void fishy() {
  290. }
  291. }
  292. final WebDriver stub = new MyStub();
  293. EventFiringWebDriver driver = new EventFiringWebDriver(stub);
  294. MyStub wrapped = (MyStub) unwrapDriver(driver);
  295. assertEquals(stub, wrapped);
  296. class MyListener extends AbstractWebDriverEventListener {
  297. @Override
  298. public void beforeNavigateTo(String url, WebDriver driver) {
  299. MyStub unwrapped = (MyStub) unwrapDriver(driver);
  300. assertEquals(stub, unwrapped);
  301. }
  302. }
  303. driver.register(new MyListener());
  304. driver.get("http://example.org");
  305. }
  306. @Test
  307. public void shouldBeAbleToAccessWrappedElementInstanceFromEventCalls() {
  308. final StubElement stubElement = new StubElement();
  309. final WebDriver stubDriver = new StubDriver() {
  310. @Override
  311. public WebElement findElement(By by) {
  312. return stubElement;
  313. }
  314. };
  315. EventFiringWebDriver driver = new EventFiringWebDriver(stubDriver);
  316. class MyListener extends AbstractWebDriverEventListener {
  317. @Override
  318. public void beforeClickOn(WebElement element, WebDriver driver) {
  319. assertEquals(stubElement, ((WrapsElement) element).getWrappedElement());
  320. }
  321. }
  322. driver.register(new MyListener());
  323. driver.findElement(By.name("stub")).click();
  324. }
  325. private WebDriver unwrapDriver(WebDriver driver) {
  326. if (driver instanceof WrapsDriver) {
  327. return unwrapDriver(((WrapsDriver) driver).getWrappedDriver());
  328. }
  329. return driver;
  330. }
  331. private static interface ExececutingDriver extends WebDriver, JavascriptExecutor {}
  332. private static class ChildDriver extends StubDriver {}
  333. }