View Javadoc

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.Options;
6   import com.atlassian.pageobjects.elements.PageElement;
7   import com.atlassian.pageobjects.elements.PageElementFinder;
8   import com.atlassian.pageobjects.elements.SelectElement;
9   import com.atlassian.pageobjects.elements.WebDriverElement;
10  import com.atlassian.pageobjects.elements.query.Poller;
11  import com.atlassian.pageobjects.elements.test.pageobjects.page.DynamicPage;
12  import com.atlassian.pageobjects.elements.test.pageobjects.page.ElementsPage;
13  import com.atlassian.pageobjects.elements.timeout.TimeoutType;
14  import com.atlassian.webdriver.utils.by.ByJquery;
15  import org.junit.Test;
16  import org.openqa.selenium.By;
17  
18  import javax.inject.Inject;
19  
20  import static com.atlassian.pageobjects.elements.query.Poller.waitUntilEquals;
21  import static com.atlassian.pageobjects.elements.query.Poller.waitUntilFalse;
22  import static com.atlassian.pageobjects.elements.query.Poller.waitUntilTrue;
23  import static junit.framework.Assert.assertEquals;
24  import static junit.framework.Assert.assertFalse;
25  import static junit.framework.Assert.assertNotNull;
26  import static junit.framework.Assert.assertTrue;
27  
28  @IgnoreBrowser(Browser.HTMLUNIT_NOJS)
29  public class TestElement extends AbstractPageElementBrowserTest
30  {
31      @Inject
32      private PageElementFinder elementFinder;
33  
34      @Test
35      public void testFieldInjection()
36      {
37          ElementsPage elementsPage = product.visit(ElementsPage.class);
38  
39          // click on a button that was injected via @ElementBy
40          elementsPage.test1_addElementsButton().click();
41  
42          // verify delayed element that was injected via @ElementBy waits
43          Poller.waitUntilTrue(elementsPage.test1_delayedSpan().timed().isPresent());
44      }
45  
46      @Test
47      public void testIsPresent()
48      {
49          product.visit(ElementsPage.class);
50  
51          // Positive - verify element that exists
52          assertTrue(product.find(By.id("test1_addElementsButton")).isPresent());
53  
54          // Negative - verify element that does not exist
55          assertFalse(product.find(By.id("test1_non_existant")).isPresent());
56  
57          // Delayed presence - click on button that adds a span with delay, verify isPresent does not wait.
58          product.find(By.id("test1_addElementsButton")).click();
59          assertFalse(product.find(By.id("test1_delayedSpan")).isPresent());
60      }
61  
62      @Test
63      public void testIsPresentWithParent()
64      {
65          product.visit(ElementsPage.class);
66  
67          final PageElement parentContainer = product.find(By.id("parent-container"));
68          assertTrue(parentContainer.isPresent());
69          assertTrue(parentContainer.find(By.className("child-button")).isPresent());
70      }
71  
72  
73      @Test
74      public void testIsPresentWhenParentIsNotPresent()
75      {
76          product.visit(ElementsPage.class);
77  
78          final PageElement notExistingParent = product.find(By.id("not-existing-parent"));
79          assertFalse(notExistingParent.isPresent());
80          assertFalse(notExistingParent.find(By.className("child-button")).isPresent());
81      }
82  
83      @Test
84      public void testIsVisible()
85      {
86          product.visit(ElementsPage.class);
87  
88          PageElement testInput = product.find(By.id("test2_input"));
89  
90          // Positive - verify input that is visible
91          assertTrue(testInput.isVisible());
92  
93          // Delayed presence - click on a button that adds an element with delay, verify isVisible waits
94          product.find(By.id("test2_addElementsButton")).click();
95          assertTrue(product.find(By.id("test2_delayedSpan")).isVisible());
96  
97          // Delayed positive - click on button to make input visible with delay and verify that it did not wait
98          product.find(By.id("test2_toggleInputVisibility")).click();
99          product.find(By.id("test2_toggleInputVisibilityWithDelay")).click();
100         assertFalse(testInput.isVisible());
101     }
102 
103     @Test
104     public void testGetText()
105     {
106         product.visit(ElementsPage.class);
107 
108         // Positive - verify span with text
109         assertEquals("Span Value", product.find(By.id("test3_span")).getText());
110 
111         // Delayed presence - click on button that adds a span with delay, verify getText waits
112         product.find(By.id("test3_addElementsButton")).click();
113         assertEquals("Delayed Span", product.find(By.id("test3_delayedSpan")).getText());
114 
115         // Delayed positive - click on button that sets the text of span with delay, verify getText does not wait
116         product.find(By.id("test3_setTextButton")).click();
117         assertEquals("", product.find(By.id("test3_spanEmpty")).getText());
118     }
119 
120     @Test
121     public void testFind()
122     {
123         product.visit(ElementsPage.class);
124 
125         // find a delayed elements within another
126         PageElement childList = product.find(By.id("test4_parentList")).find(By.tagName("ul"));
127         assertEquals("test4_childList", childList.getAttribute("id"));
128 
129         PageElement leafList = childList.find(By.tagName("ul"));
130         assertEquals("test4_leafList", leafList.getAttribute("id"));
131 
132         PageElement listItem = leafList.find(By.tagName("li"));
133         assertEquals("Item 1", listItem.getText());
134 
135         //wait for presence on an element within another
136         product.find(By.id("test4_addElementsButton")).click();
137         waitUntilTrue(leafList.find(By.linkText("Item 4")).timed().isPresent());
138 
139         //wait for text on an element within another
140         product.visit(ElementsPage.class);
141 
142         product.find(By.id("test4_addElementsButton")).click();
143         assertEquals("Item 5", product.find(By.className("listitem-active")).getText());
144     }
145 
146     @Test
147     public void testGetTagName()
148     {
149         ElementsPage elementsPage = product.visit(ElementsPage.class);
150 
151         assertEquals("input", elementsPage.test1_addElementsButton().getTagName());
152     }
153 
154     @Test
155     public void testHasAttribute()
156     {
157         ElementsPage elementsPage = product.visit(ElementsPage.class);
158 
159         // positive
160         assertTrue(elementsPage.test1_addElementsButton().hasAttribute("type", "button"));
161 
162         // incorrect attribute
163         assertFalse(elementsPage.test1_addElementsButton().hasAttribute("type", "bar"));
164 
165         // attribute not present
166         assertFalse(elementsPage.test1_addElementsButton().hasAttribute("nonexistant", "foo"));
167     }
168 
169     @Test
170     public void shouldFindElementByJquery()
171     {
172         product.visit(ElementsPage.class);
173         final PageElement awesomeDiv = product.find(By.id("awesome-div"));
174         final PageElement awesomeSpan = awesomeDiv.find(ByJquery.$("span:contains(Awesome)"));
175         assertNotNull(awesomeSpan);
176         assertEquals("awesome-span", awesomeSpan.getAttribute("id"));
177 
178         final SelectElement awesomeSelect = elementFinder.find(By.id("awesome-select"), SelectElement.class);
179         awesomeSelect.find(ByJquery.$("option:contains(Volvo)")).select();
180         assertEquals(Options.value("volvo"), awesomeSelect.getSelected());
181     }
182 
183     @Test
184     public void shouldRebindElementIfStale_whenLocatedByAnnotation()
185     {
186         DynamicPage page = product.visit(DynamicPage.class);
187 
188         assertEquals("Hello Tester!", page.createFieldSet().helloWorld("Tester").getMessage());
189         assertEquals("Hello Developer!", page.createFieldSet().helloWorld("Developer").getMessage());
190 
191     }
192 
193     @Test
194     public void shouldRebindElementIfStale_whenOriginalElementBecomesStaleAfterSomeTime()
195     {
196         // This strategy can be used by pabeobjects that reload the same page after an action
197 
198         DynamicPage page = product.visit(DynamicPage.class);
199         page.createFieldSet();
200 
201         PageElementFinder elementFinder = page.getElementFinder();
202         PageElement button = elementFinder.find(By.id("helloWorldButton"), TimeoutType.AJAX_ACTION);
203 
204         product.getTester().getDriver().executeScript("$('#helloWorldButton').addClass('posting')");
205         page.removeAndCreateFieldSetSlowly();
206         waitUntilFalse(button.timed().hasClass("posting"));
207     }
208 
209 
210     @Test
211     public void shouldRebindElementIfStale_whenLocatedByElementFinder()
212     {
213         DynamicPage page = product.visit(DynamicPage.class);
214 
215         PageElementFinder elementFinder = page.getElementFinder();
216         PageElement username = elementFinder.find(By.id("nameTextBox"));
217         PageElement button = elementFinder.find(By.id("helloWorldButton"));
218         PageElement message = elementFinder.find(By.id("messageSpan"));
219 
220         page.createFieldSet();
221 
222         username.type("Tester");
223         button.click();
224         assertEquals("Hello Tester!", message.getText());
225 
226         // recreate the fields
227         page.createFieldSet();
228         username.type("Developer");
229         button.click();
230         assertEquals("Hello Developer!", message.getText());
231     }
232 
233     @Test
234     public void shouldRebindElementsIfStale_whenLocatedByParentFindSingle()
235     {
236         DynamicPage page = product.visit(DynamicPage.class);
237         PageElementFinder elementFinder = page.getElementFinder();
238 
239         PageElement div = elementFinder.find(By.id("placeHolderDiv"));
240         PageElement username = div.find(By.tagName("fieldset")).find(By.id("nameTextBox"));
241         PageElement button = div.find(By.tagName("fieldset")).find(By.id("helloWorldButton"));
242         PageElement message = div.find(By.tagName("fieldset")).find(By.id("messageSpan"));
243 
244         page.createFieldSet();
245         username.type("Tester");
246         button.click();
247         assertEquals("Hello Tester!", message.getText());
248 
249         //recreate the fields
250         page.createFieldSet();
251         username.type("Developer");
252         button.click();
253         assertEquals("Hello Developer!", message.getText());
254     }
255 
256     @Test
257     public void elementShouldBeConvertedToWebElement()
258     {
259         DynamicPage page = product.visit(DynamicPage.class);
260         PageElementFinder elementFinder = page.getElementFinder();
261 
262         PageElement div = elementFinder.find(By.id("placeHolderDiv"));
263         WebDriverElement username = (WebDriverElement) div.find(By.tagName("fieldset")).find(By.id("nameTextBox"));
264         PageElement button = div.find(By.tagName("fieldset")).find(By.id("helloWorldButton"));
265         PageElement message = div.find(By.tagName("fieldset")).find(By.id("messageSpan"));
266 
267         page.createFieldSet();
268         username.asWebElement().sendKeys("Tester");
269         button.click();
270         assertEquals("Hello Tester!", message.getText());
271 
272         //recreate the fields
273         page.createFieldSet();
274         username.asWebElement().sendKeys("Developer");
275         button.click();
276         assertEquals("Hello Developer!", message.getText());
277     }
278 
279     @Test
280     public void shouldRebindElementsIfStale_whenLocatingByParentFindAll()
281     {
282         DynamicPage page = product.visit(DynamicPage.class);
283         PageElementFinder elementFinder = page.getElementFinder();
284 
285         page.createFieldSet();
286 
287         PageElement fieldset = elementFinder.find(By.tagName("fieldset"));
288         PageElement username = fieldset.findAll(By.tagName("input")).get(0);
289         PageElement button = fieldset.findAll(By.tagName("input")).get(1);
290         PageElement message = fieldset.find(By.id("messageSpan"));
291 
292         username.type("Tester");
293         button.click();
294         assertEquals("Hello Tester!", message.getText());
295 
296         //recreate the fields
297         page.createFieldSet();
298         username.type("Developer");
299         button.click();
300         assertEquals("Hello Developer!", message.getText());
301     }
302 
303     @Test
304     public void shouldRebindElementsIfStale_whenLocatingByParentFindAllGivenParentAlwaysExists()
305     {
306         DynamicPage page = product.visit(DynamicPage.class);
307         PageElementFinder elementFinder = page.getElementFinder();
308 
309         page.createFieldSet();
310 
311         PageElement mainDiv = elementFinder.find(By.id("placeHolderDiv"));
312         // needs timeout more than 3 seconds
313         PageElement username = mainDiv.findAll(By.tagName("input")).get(0).withTimeout(TimeoutType.AJAX_ACTION);
314         PageElement button = mainDiv.findAll(By.tagName("input")).get(1).withTimeout(TimeoutType.AJAX_ACTION);
315         PageElement message = mainDiv.find(By.id("messageSpan")).withTimeout(TimeoutType.AJAX_ACTION);
316 
317         username.type("Tester");
318         button.click();
319         assertEquals("Hello Tester!", message.getText());
320 
321         //recreate the fields
322         page.createFieldSetSlowly();
323         username.type("Developer");
324         button.click();
325         waitUntilEquals("Hello Developer!", message.timed().getText());
326     }
327 
328     @Test
329     public void testExecuteScriptOnAnElement()
330     {
331         product.visit(ElementsPage.class);
332         PageElement button = elementFinder.find(By.id(("test11_button")));
333 
334         assertFalse(button.hasClass("test"));
335 
336         button.javascript().execute("$(arguments[0]).addClass('test')");
337         Poller.waitUntilTrue(button.timed().hasClass("test"));
338 
339         assertEquals(Boolean.TRUE, button.javascript().execute("return $(arguments[0]).hasClass('test')"));
340     }
341 }