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