1 package com.atlassian.pageobjects.elements.query.webdriver;
2
3 import com.atlassian.pageobjects.elements.WebDriverLocatable;
4 import com.atlassian.pageobjects.elements.query.AbstractTimedQuery;
5 import com.atlassian.pageobjects.elements.query.ExpirationHandler;
6 import com.atlassian.pageobjects.elements.query.PollingQuery;
7 import com.atlassian.pageobjects.elements.query.TimedCondition;
8 import com.atlassian.pageobjects.elements.query.TimedQuery;
9 import com.atlassian.pageobjects.elements.timeout.TimeoutType;
10 import com.atlassian.pageobjects.elements.timeout.Timeouts;
11 import com.atlassian.webdriver.AtlassianWebDriver;
12 import com.google.common.base.Supplier;
13 import org.openqa.selenium.Dimension;
14 import org.openqa.selenium.Point;
15
16 import javax.annotation.concurrent.NotThreadSafe;
17 import javax.inject.Inject;
18
19 import static com.atlassian.pageobjects.elements.timeout.TimeoutType.DEFAULT;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 import static com.google.common.base.Preconditions.checkState;
22
23
24
25
26
27 @NotThreadSafe
28 public class WebDriverQueryFactory
29 {
30 private final WebDriverLocatable locatable;
31
32 @Inject
33 private Timeouts timeouts;
34
35 @Inject
36 private AtlassianWebDriver webDriver;
37
38 public WebDriverQueryFactory(WebDriverLocatable locatable)
39 {
40 this.locatable = checkNotNull(locatable);
41 }
42
43 public WebDriverQueryFactory(WebDriverLocatable locatable, Timeouts timeouts, AtlassianWebDriver webDriver)
44 {
45 this.locatable = checkNotNull(locatable);
46 this.timeouts = timeouts;
47 this.webDriver = webDriver;
48 }
49
50 private long interval = -1L;
51
52 private long interval()
53 {
54 if (interval == -1)
55 {
56 interval = timeouts.timeoutFor(TimeoutType.EVALUATION_INTERVAL);
57 checkState(interval > 0);
58 }
59 return interval;
60 }
61
62 public TimedCondition isPresent(TimeoutType timeoutType)
63 {
64 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isPresent(),
65 timeouts.timeoutFor(timeoutType), interval());
66 }
67
68 public TimedCondition isPresent()
69 {
70 return isPresent(DEFAULT);
71 }
72
73 public TimedCondition isVisible(TimeoutType timeoutType)
74 {
75 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isVisible(),
76 timeouts.timeoutFor(timeoutType), interval());
77 }
78
79 public TimedCondition isVisible()
80 {
81 return isVisible(DEFAULT);
82 }
83
84 public TimedCondition isEnabled(TimeoutType timeoutType)
85 {
86 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isEnabled(),
87 timeouts.timeoutFor(timeoutType), interval());
88 }
89
90 public TimedCondition isEnabled()
91 {
92 return isEnabled(DEFAULT);
93 }
94
95 public TimedCondition isSelected(TimeoutType timeoutType)
96 {
97 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isSelected(),
98 timeouts.timeoutFor(timeoutType), interval());
99 }
100
101 public TimedCondition isSelected()
102 {
103 return isSelected(DEFAULT);
104 }
105
106 public TimedQuery<String> getText(TimeoutType timeoutType)
107 {
108 return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getText(),
109 timeouts.timeoutFor(timeoutType), interval());
110 }
111
112 public TimedQuery<String> getText()
113 {
114 return getText(DEFAULT);
115 }
116
117 public TimedQuery<String> getValue(TimeoutType timeoutType)
118 {
119 return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getValue(),
120 timeouts.timeoutFor(timeoutType), interval());
121 }
122
123 public TimedQuery<String> getValue()
124 {
125 return getValue(DEFAULT);
126 }
127
128 public TimedCondition hasAttribute(String attributeName, String expectedValue, TimeoutType timeoutType)
129 {
130 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver,
131 WebDriverQueryFunctions.hasAttribute(attributeName, expectedValue),
132 timeouts.timeoutFor(timeoutType), interval());
133 }
134
135 public TimedCondition hasAttribute(String attributeName, String expectedValue)
136 {
137 return hasAttribute(attributeName, expectedValue, DEFAULT);
138 }
139
140 public TimedQuery<String> getAttribute(String attributeName, TimeoutType timeoutType)
141 {
142 return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver,
143 WebDriverQueryFunctions.getAttribute(attributeName),
144 timeouts.timeoutFor(timeoutType), interval());
145 }
146
147 public TimedQuery<String> getAttribute(String attributeName)
148 {
149 return getAttribute(attributeName, DEFAULT);
150 }
151
152
153 public TimedCondition hasClass(String className, TimeoutType timeoutType)
154 {
155 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasClass(className),
156 timeouts.timeoutFor(timeoutType), interval());
157 }
158
159 public TimedCondition hasClass(String className)
160 {
161 return hasClass(className, DEFAULT);
162 }
163
164 public TimedQuery<String> getTagName(TimeoutType timeoutType)
165 {
166 return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getTagName(),
167 timeouts.timeoutFor(timeoutType), interval());
168 }
169
170 public TimedQuery<String> getTagName()
171 {
172 return getTagName(DEFAULT);
173 }
174
175 public TimedCondition hasText(String text, TimeoutType timeoutType)
176 {
177 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasText(text),
178 timeouts.timeoutFor(timeoutType), interval());
179 }
180
181 public TimedCondition hasText(String text)
182 {
183 return hasText(text, DEFAULT);
184 }
185
186 public TimedCondition hasValue(String value, TimeoutType timeoutType)
187 {
188 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasValue(value),
189 timeouts.timeoutFor(timeoutType), interval());
190 }
191
192 public TimedCondition hasValue(String value)
193 {
194 return hasValue(value, DEFAULT);
195 }
196
197 public TimedQuery<Point> getLocation(TimeoutType timeoutType)
198 {
199 return new WebDriverLocatableBasedTimedQuery<Point>(locatable, webDriver, WebDriverQueryFunctions.getLocation(),
200 timeouts.timeoutFor(timeoutType), interval());
201 }
202
203 public TimedQuery<Dimension> getSize(TimeoutType timeoutType)
204 {
205 return new WebDriverLocatableBasedTimedQuery<Dimension>(locatable, webDriver, WebDriverQueryFunctions.getSize(),
206 timeouts.timeoutFor(timeoutType), interval());
207 }
208
209 public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier, TimeoutType timeoutType)
210 {
211 return new AbstractTimedQuery<T>(timeouts.timeoutFor(timeoutType), PollingQuery.DEFAULT_INTERVAL,
212 ExpirationHandler.RETURN_CURRENT)
213 {
214
215 @Override
216 protected boolean shouldReturn(T currentEval)
217 {
218 return true;
219 }
220
221 @Override
222 protected T currentValue()
223 {
224 return supplier.get();
225 }
226 };
227 }
228
229 public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier)
230 {
231 return forSupplier(supplier, DEFAULT);
232 }
233 }