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