Skip to content
This repository was archived by the owner on Mar 10, 2020. It is now read-only.

Commit 9892d8c

Browse files
benhamideneAnis Ben Hamidene
authored andcommitted
#22: Support for @visible for embedded container page objects
1 parent 866b8d6 commit 9892d8c

File tree

4 files changed

+74
-22
lines changed

4 files changed

+74
-22
lines changed

documentation/chapters/page-object.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ invoked.
168168
If the annotated field is a `List` or `PageObjectList` the value property of the annotation must be used to declare how many
169169
elements of the list should be visible.
170170

171+
@Visble can be also used for embedded containers. If an embedded container is not annotated then is contained page object that are annotated with @Visible will not be verified at creation time.
172+
171173
**Note:** The given number is not the number of page objects expected to be in the list! It is the number of expected _visible_ page objects in the list!
172174

173175
**Properties:**

webtester-core/src/main/java/info/novatec/testit/webtester/internal/pageobjects/DefaultPageObjectFactory.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.lang.reflect.ParameterizedType;
1010
import java.util.Deque;
1111
import java.util.List;
12+
import java.util.Set;
13+
1214
import javax.annotation.PostConstruct;
1315

1416
import org.apache.commons.lang.StringUtils;
@@ -227,10 +229,34 @@ private boolean shouldExecuteMethod(Method method) {
227229
}
228230

229231
private <T extends PageObject> void checkVisibilityOfAnnotatedFields(T pageInstance, Class<T> pageClazz) {
230-
Deque<Class<?>> classStack = ReflectionUtils.getClassAncestry(pageClazz);
231-
while (!classStack.isEmpty()) {
232-
checkVisibilityOfAnnotatedFieldsOfClass(pageInstance, classStack.pop());
232+
if (shouldCheckVisibilty(pageInstance)) {
233+
Deque<Class<?>> classStack = ReflectionUtils.getClassAncestry(pageClazz);
234+
while (!classStack.isEmpty()) {
235+
checkVisibilityOfAnnotatedFieldsOfClass(pageInstance, classStack.pop());
236+
}
237+
}
238+
}
239+
240+
private <T extends PageObject> boolean shouldCheckVisibilty(T pageInstance) {
241+
PageObject parent = pageInstance.getParent();
242+
if (parent == null) {
243+
return true;
244+
}
245+
246+
Set<Field> parentFields = ReflectionUtils.getAllFieldsOfClassHierarchy(parent.getClass());
247+
for (Field field : parentFields) {
248+
if (field.getDeclaringClass().isAssignableFrom(PageObject.class)) {
249+
try {
250+
Object fieldValue = ReflectionUtils.forceGetFieldValue(field, parent);
251+
if (fieldValue != null && fieldValue.equals(pageInstance)) {
252+
return isAnnotatedWithVisible(field);
253+
}
254+
} catch (ReflectiveOperationException e) {
255+
continue;
256+
}
257+
}
233258
}
259+
return false;
234260
}
235261

236262
private <T extends PageObject> void checkVisibilityOfAnnotatedFieldsOfClass(T pageInstance, Class<?> clazz) {
Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
package integration.annotations;
22

3-
import java.util.List;
4-
5-
import org.junit.Test;
6-
7-
import integration.AbstractWebTesterIntegrationTest;
8-
93
import info.novatec.testit.webtester.api.annotations.IdentifyUsing;
104
import info.novatec.testit.webtester.api.annotations.Visible;
11-
import info.novatec.testit.webtester.api.browser.Browser;
125
import info.novatec.testit.webtester.api.enumerations.Method;
136
import info.novatec.testit.webtester.api.exceptions.PageObjectFactoryException.VisiblePageObjectFieldException;
147
import info.novatec.testit.webtester.api.exceptions.PageObjectFactoryException.VisiblePageObjectListFieldException;
158
import info.novatec.testit.webtester.pageobjects.PageObject;
169
import info.novatec.testit.webtester.pageobjects.TextField;
10+
import info.novatec.testit.webtester.utils.Asserts;
11+
import integration.AbstractWebTesterIntegrationTest;
12+
13+
import java.util.List;
1714

15+
import org.junit.Test;
1816

1917
public class VisibleIntegrationTest extends AbstractWebTesterIntegrationTest {
2018

@@ -25,36 +23,47 @@ protected String getHTMLFilePath() {
2523

2624
@Test
2725
public void testThatVisibleAnnotationIsUsedToCheckVisibilityOfPageObject() {
28-
getBrowser().create(SingleVisiblePage.class);
29-
// nothing to assert because initialization was successful
26+
SingleVisiblePage singleVisiblePage = getBrowser().create(SingleVisiblePage.class);
27+
Asserts.assertVisible(singleVisiblePage);
3028
}
3129

3230
@Test
3331
public void testThatVisibleAnnotationIsUsedToCheckVisibilityOfPageObjectList() {
34-
getBrowser().create(MultiVisiblePage.class);
35-
// nothing to assert because initialization was successful
32+
MultiVisiblePage multiVisiblePage = getBrowser().create(MultiVisiblePage.class);
33+
Asserts.assertVisible(multiVisiblePage);
3634
}
3735

3836
@Test(expected = VisiblePageObjectFieldException.class)
3937
public void testThatVisibleAnnotationOnNonExistingPageObjectLeadsToException() {
40-
Browser browser = getBrowser();
41-
browser.getConfiguration().setWaitTimeout(1);
42-
browser.open(getFormattedTestResourcePath("html/empty.html"), SingleVisiblePage.class);
38+
getBrowser().create(InvisiblePage.class);
39+
4340
}
4441

4542
@Test(expected = VisiblePageObjectListFieldException.class)
4643
public void testThatVisibleAnnotationOnPageObjectListLeadsToExceptionIfThereAreNotEnoughVisibleObjects() {
4744
getBrowser().create(MultiVisiblePageWrongCount.class);
4845
}
4946

47+
@Test
48+
public void testThatAnnotationOnContentsOfInvisibleContainerBoNotLeadToException(){
49+
getBrowser().create(PageWithInvisibleContainer.class);
50+
51+
}
52+
5053
public static class SingleVisiblePage extends PageObject {
5154

5255
@Visible
5356
@IdentifyUsing("textfield")
5457
TextField textfield;
5558

5659
}
57-
60+
61+
public static class InvisiblePage extends PageObject{
62+
@Visible
63+
@IdentifyUsing(method = Method.ID , value="non:existing:field")
64+
TextField invisibleTextField;
65+
}
66+
5867
public static class MultiVisiblePage extends PageObject {
5968

6069
@Visible(2)
@@ -70,5 +79,17 @@ public static class MultiVisiblePageWrongCount extends PageObject {
7079
List<TextField> multipleTextFields;
7180

7281
}
82+
83+
public static class InvisibleContainer extends PageObject{
84+
@Visible
85+
@IdentifyUsing("invisible:textfield")
86+
TextField invisibleTextField;
87+
}
88+
89+
public static class PageWithInvisibleContainer extends PageObject{
90+
91+
@IdentifyUsing("invisibleContainer")
92+
InvisibleContainer invisibleContainer;
93+
}
7394

7495
}

webtester-core/src/test/resources/html/annotations/visible.html

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ <h3>This page contains elements for testing the functionality of
1919
<tr>
2020
<td>Multiple text fields - one invisible</td>
2121
<td>
22-
<input id="multi:textfield:1"><br>
23-
<input id="multi:textfield:2"><br>
24-
<input id="multi:textfield:3" style="display: none">
22+
<input id="multi:textfield:1"/><br>
23+
<input id="multi:textfield:2"/><br>
24+
<input id="multi:textfield:3" style="display: none"/>
2525
</td>
2626
</tr>
2727
</tbody>
@@ -30,6 +30,9 @@ <h3>This page contains elements for testing the functionality of
3030
<br>
3131
<br>
3232
<hr>
33-
33+
34+
<div id="invisibleContainer" style="display: none">
35+
<input id="invisible:textfield"/>
36+
</div>
3437
</body>
3538
</html>

0 commit comments

Comments
 (0)