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
14 import javax.annotation.concurrent.NotThreadSafe;
15 import javax.inject.Inject;
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
25 @NotThreadSafe
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
151 public TimedCondition hasClass(String className, TimeoutType timeoutType)
152 {
153 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasClass(className),
154 timeouts.timeoutFor(timeoutType), interval());
155 }
156
157 public TimedCondition hasClass(String className)
158 {
159 return hasClass(className, DEFAULT);
160 }
161
162 public TimedQuery<String> getTagName(TimeoutType timeoutType)
163 {
164 return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getTagName(),
165 timeouts.timeoutFor(timeoutType), interval());
166 }
167
168 public TimedQuery<String> getTagName()
169 {
170 return getTagName(DEFAULT);
171 }
172
173 public TimedCondition hasText(String text, TimeoutType timeoutType)
174 {
175 return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasText(text),
176 timeouts.timeoutFor(timeoutType), interval());
177 }
178
179 public TimedCondition hasText(String text)
180 {
181 return hasText(text, DEFAULT);
182 }
183
184 public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier, TimeoutType timeoutType)
185 {
186 return new AbstractTimedQuery<T>(timeouts.timeoutFor(timeoutType), PollingQuery.DEFAULT_INTERVAL,
187 ExpirationHandler.RETURN_CURRENT)
188 {
189
190 @Override
191 protected boolean shouldReturn(T currentEval)
192 {
193 return true;
194 }
195
196 @Override
197 protected T currentValue()
198 {
199 return supplier.get();
200 }
201 };
202 }
203
204 public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier)
205 {
206 return forSupplier(supplier, DEFAULT);
207 }
208 }