1 package com.atlassian.pageobjects.elements.test;
2
3 import com.atlassian.pageobjects.browser.Browser;
4 import com.atlassian.pageobjects.browser.IgnoreBrowser;
5 import com.atlassian.pageobjects.elements.GlobalElementFinder;
6 import com.atlassian.pageobjects.elements.Options;
7 import com.atlassian.pageobjects.elements.PageElement;
8 import com.atlassian.pageobjects.elements.PageElementFinder;
9 import com.atlassian.pageobjects.elements.SelectElement;
10 import com.atlassian.pageobjects.elements.query.Poller;
11 import com.atlassian.pageobjects.elements.query.TimedQuery;
12 import com.atlassian.pageobjects.elements.test.pageobjects.page.ElementsPage;
13 import org.hamcrest.Matchers;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.openqa.selenium.By;
17
18 import static org.junit.Assert.assertEquals;
19 import static org.junit.Assert.assertFalse;
20 import static org.junit.Assert.assertNotNull;
21 import static org.junit.Assert.assertSame;
22 import static org.junit.Assert.assertThat;
23 import static org.junit.Assert.assertTrue;
24
25
26
27
28
29
30 @IgnoreBrowser(Browser.HTMLUNIT_NOJS)
31 public class TestPageElementJavaScript extends AbstractPageElementBrowserTest
32 {
33
34 private PageElementFinder elementFinder;
35
36 @Before
37 public void init()
38 {
39 product.visit(ElementsPage.class);
40 elementFinder = product.getPageBinder().bind(GlobalElementFinder.class);
41 }
42
43 @Test
44 public void shouldExecuteSimpleJavascript()
45 {
46 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
47 final Object delayedDivPresent = delayedDiv.javascript().execute("return $(arguments[0]).length > 0");
48 assertNotNull(delayedDivPresent);
49 assertTrue(delayedDivPresent instanceof Boolean);
50 assertTrue((Boolean) delayedDivPresent);
51 }
52
53 @Test
54 public void shouldExecuteTimedScript()
55 {
56 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
57 TimedQuery<Boolean> delayedSpanPresent = delayedDiv.javascript().executeTimed(Boolean.class,
58 "return $(arguments[0]).find('#test1_delayedSpan').length > 0");
59 assertFalse(delayedSpanPresent.now());
60 elementFinder.find(By.id("test1_addElementsButton")).click();
61 Poller.waitUntilTrue(delayedSpanPresent);
62 }
63
64 @Test(expected = IllegalArgumentException.class)
65 public void executeTimedShouldNotAcceptPageElementAsResultType()
66 {
67 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
68 delayedDiv.javascript().executeTimed(PageElement.class, "return arguments[0]");
69 }
70
71 @Test
72 public void shouldReturnSamePageElement()
73 {
74 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
75 Object result = delayedDiv.javascript().execute("return arguments[0]");
76 assertSame(delayedDiv, result);
77 }
78
79 @Test
80 public void shouldReturnSamePageElementWithCast()
81 {
82 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
83 PageElement result = delayedDiv.javascript().execute(PageElement.class, "return arguments[0]");
84 assertSame(delayedDiv, result);
85 }
86
87 @Test
88 public void shouldReturnNewPageElement()
89 {
90 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
91 Object result = delayedDiv.javascript().execute("return arguments[1]", elementFinder.find(By.id("test1_addElementsButton")));
92 assertTrue(result instanceof PageElement);
93 final PageElement element = (PageElement) result;
94 assertEquals("test1_addElementsButton", element.getAttribute("id"));
95 }
96
97 @Test
98 public void shouldReturnSelectElement()
99 {
100 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
101 SelectElement awesomeSelect = delayedDiv.javascript().execute(SelectElement.class, "return arguments[1]", elementFinder.find(By.id("awesome-select")));
102 awesomeSelect.select(Options.value("volvo"));
103 }
104
105 @Test
106 public void executeAsyncNonTypedShouldWorkForSimpleType()
107 {
108 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
109 Object result = delayedDiv.javascript().executeAsync("arguments[1](true)");
110 assertTrue(result instanceof Boolean);
111 assertEquals(Boolean.TRUE, result);
112 }
113
114 @Test
115 @IgnoreBrowser(value = Browser.HTMLUNIT, reason = "http://code.google.com/p/selenium/issues/detail?id=4257")
116 public void executeAsyncNonTypedShouldWorkForPageElement()
117 {
118 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
119 Object result = delayedDiv.javascript().executeAsync("arguments[1](arguments[0])");
120 assertThat(result, Matchers.instanceOf(PageElement.class));
121 assertSame(delayedDiv, result);
122 }
123
124 @Test
125 public void executeAsyncTypedShouldWorkForSimpleType()
126 {
127 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
128 String result = delayedDiv.javascript().executeAsync(String.class, "arguments[1]('woohoo')");
129 assertEquals("woohoo", result);
130 }
131
132 @Test
133 @IgnoreBrowser(value = Browser.HTMLUNIT, reason = "http://code.google.com/p/selenium/issues/detail?id=4257")
134 public void executeAsyncTypedShouldWorkForPageElement()
135 {
136 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
137 PageElement result = delayedDiv.javascript().executeAsync(PageElement.class, "arguments[1](arguments[0])");
138 assertSame(delayedDiv, result);
139 }
140
141 @Test
142 @IgnoreBrowser(value = Browser.HTMLUNIT, reason = "http://code.google.com/p/selenium/issues/detail?id=4257")
143 public void executeAsyncTypedShouldWorkForSelectElement()
144 {
145 final PageElement delayedDiv = elementFinder.find(By.id("test1_delayedDiv"));
146 SelectElement result = delayedDiv.javascript().executeAsync(SelectElement.class, "arguments[2](arguments[1])",
147 elementFinder.find(By.id("awesome-select")));
148 assertEquals("awesome-select", result.getAttribute("id"));
149 result.select(Options.value("volvo"));
150 }
151 }