Skip to content

Commit e80c239

Browse files
authored
test(dom): convert remaining element handle convenience tests (#222)
1 parent 50a6313 commit e80c239

File tree

2 files changed

+174
-0
lines changed

2 files changed

+174
-0
lines changed

playwright/src/main/java/com/microsoft/playwright/impl/JSHandleImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
import static com.microsoft.playwright.impl.Utils.isFunctionBody;
2929

3030
public class JSHandleImpl extends ChannelOwner implements JSHandle {
31+
private String preview;
32+
3133
public JSHandleImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
3234
super(parent, type, guid, initializer);
35+
this.preview = initializer.get("preview").getAsString();
3336
}
3437

3538
@Override
@@ -101,4 +104,17 @@ public Object jsonValue() {
101104
return deserialize(value);
102105
});
103106
}
107+
108+
@Override
109+
void handleEvent(String event, JsonObject parameters) {
110+
if ("previewUpdated".equals(event)) {
111+
preview = parameters.get("preview").getAsString();
112+
}
113+
super.handleEvent(event, parameters);
114+
}
115+
116+
@Override
117+
public String toString() {
118+
return preview;
119+
}
104120
}

playwright/src/test/java/com/microsoft/playwright/TestElementHandleConvenience.java

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,164 @@
2121
import static org.junit.jupiter.api.Assertions.*;
2222

2323
public class TestElementHandleConvenience extends TestBase {
24+
@Test
25+
void shouldHaveANicePreview() {
26+
page.navigate(server.PREFIX + "/dom.html");
27+
ElementHandle outer = page.querySelector("#outer");
28+
ElementHandle inner = page.querySelector("#inner");
29+
ElementHandle check = page.querySelector("#check");
30+
JSHandle text = inner.evaluateHandle("e => e.firstChild");
31+
page.evaluate("() => 1"); // Give them a chance to calculate the preview.
32+
assertEquals("JSHandle@<div id=\"outer\" name=\"value\">…</div>", outer.toString());
33+
assertEquals("JSHandle@<div id=\"inner\">Text,↵more text</div>", inner.toString());
34+
assertEquals("JSHandle@#text=Text,↵more text", text.toString());
35+
assertEquals("JSHandle@<input checked id=\"check\" foo=\"bar\"\" type=\"checkbox\"/>", check.toString());
36+
}
37+
38+
@Test
39+
void getAttributeShouldWork() {
40+
page.navigate(server.PREFIX + "/dom.html");
41+
ElementHandle handle = page.querySelector("#outer");
42+
assertEquals("value", handle.getAttribute("name"));
43+
assertNull(handle.getAttribute("foo"));
44+
assertEquals("value", page.getAttribute("#outer", "name"));
45+
assertNull(page.getAttribute("#outer", "foo"));
46+
}
47+
48+
@Test
49+
void innerHTMLShouldWork() {
50+
page.navigate(server.PREFIX + "/dom.html");
51+
ElementHandle handle = page.querySelector("#outer");
52+
assertEquals("<div id=\"inner\">Text,\nmore text</div>", handle.innerHTML());
53+
assertEquals("<div id=\"inner\">Text,\nmore text</div>", page.innerHTML("#outer"));
54+
}
55+
56+
@Test
57+
void innerTextShouldWork() {
58+
page.navigate(server.PREFIX + "/dom.html");
59+
ElementHandle handle = page.querySelector("#inner");
60+
assertEquals("Text, more text", handle.innerText());
61+
assertEquals("Text, more text", page.innerText("#inner"));
62+
}
63+
64+
@Test
65+
void innerTextShouldThrow() {
66+
page.setContent("<svg>text</svg>");
67+
try {
68+
page.innerText("svg");
69+
fail("did not throw");
70+
} catch (PlaywrightException e) {
71+
assertTrue(e.getMessage().contains("Not an HTMLElement"));
72+
}
73+
ElementHandle handle = page.querySelector("svg");
74+
try {
75+
handle.innerText();
76+
fail("did not throw");
77+
} catch (PlaywrightException e) {
78+
assertTrue(e.getMessage().contains("Not an HTMLElement"));
79+
}
80+
}
81+
82+
@Test
83+
void textContentShouldWork() {
84+
page.navigate(server.PREFIX + "/dom.html");
85+
ElementHandle handle = page.querySelector("#inner");
86+
assertEquals("Text,\nmore text", handle.textContent());
87+
assertEquals("Text,\nmore text", page.textContent("#inner"));
88+
}
89+
90+
@Test
91+
void textContentShouldBeAtomic() {
92+
String createDummySelector = "{\n" +
93+
" query(root, selector) {\n" +
94+
" const result = root.querySelector(selector);\n" +
95+
" if (result)\n" +
96+
" Promise.resolve().then(() => result.textContent = 'modified');\n" +
97+
" return result;\n" +
98+
" },\n" +
99+
" queryAll(root, selector) {\n" +
100+
" const result = Array.from(root.querySelectorAll(selector));\n" +
101+
" for (const e of result)\n" +
102+
" Promise.resolve().then(() => e.textContent = 'modified');\n" +
103+
" return result;\n" +
104+
" }\n" +
105+
"}\n";
106+
playwright.selectors().register("textContent", createDummySelector);
107+
page.setContent("<div>Hello</div>");
108+
String tc = page.textContent("textContent=div");
109+
assertEquals("Hello", tc);
110+
assertEquals("modified", page.evaluate("() => document.querySelector('div').textContent"));
111+
}
112+
113+
@Test
114+
void innerTextShouldBeAtomic() {
115+
String createDummySelector = "{\n" +
116+
" query(root, selector) {\n" +
117+
" const result = root.querySelector(selector);\n" +
118+
" if (result)\n" +
119+
" Promise.resolve().then(() => result.textContent = 'modified');\n" +
120+
" return result;\n" +
121+
" },\n" +
122+
" queryAll(root, selector) {\n" +
123+
" const result = Array.from(root.querySelectorAll(selector));\n" +
124+
" for (const e of result)\n" +
125+
" Promise.resolve().then(() => e.textContent = 'modified');\n" +
126+
" return result;\n" +
127+
" }\n" +
128+
"}\n";
129+
playwright.selectors().register("innerText", createDummySelector);
130+
page.setContent("<div>Hello</div>");
131+
String tc = page.innerText("innerText=div");
132+
assertEquals("Hello", tc);
133+
assertEquals("modified", page.evaluate("() => document.querySelector('div').innerText"));
134+
}
135+
136+
@Test
137+
void innerHTMLShouldBeAtomic() {
138+
String createDummySelector = "{\n" +
139+
" query(root, selector) {\n" +
140+
" const result = root.querySelector(selector);\n" +
141+
" if (result)\n" +
142+
" Promise.resolve().then(() => result.textContent = 'modified');\n" +
143+
" return result;\n" +
144+
" },\n" +
145+
" queryAll(root, selector) {\n" +
146+
" const result = Array.from(root.querySelectorAll(selector));\n" +
147+
" for (const e of result)\n" +
148+
" Promise.resolve().then(() => e.textContent = 'modified');\n" +
149+
" return result;\n" +
150+
" }\n" +
151+
"}\n";
152+
playwright.selectors().register("innerHTML", createDummySelector);
153+
page.setContent("<div>Hello<span>world</span></div>");
154+
String tc = page.innerHTML("innerHTML=div");
155+
assertEquals("Hello<span>world</span>", tc);
156+
assertEquals("modified", page.evaluate("() => document.querySelector('div').innerHTML"));
157+
}
158+
159+
@Test
160+
void getAttributeShouldBeAtomic() {
161+
String createDummySelector = "{\n" +
162+
" query(root, selector) {\n" +
163+
" const result = root.querySelector(selector);\n" +
164+
" if (result)\n" +
165+
" Promise.resolve().then(() => result.setAttribute('foo', 'modified'));\n" +
166+
" return result;\n" +
167+
" },\n" +
168+
" queryAll(root, selector) {\n" +
169+
" const result = Array.from(root.querySelectorAll(selector));\n" +
170+
" for (const e of result)\n" +
171+
" Promise.resolve().then(() => e.setAttribute('foo', 'modified'));\n" +
172+
" return result;\n" +
173+
" }\n" +
174+
"}\n";
175+
playwright.selectors().register("getAttribute", createDummySelector);
176+
page.setContent("<div foo=hello></div>");
177+
String tc = page.getAttribute("getAttribute=div", "foo");
178+
assertEquals("hello", tc);
179+
assertEquals("modified", page.evaluate("() => document.querySelector('div').getAttribute('foo')"));
180+
}
181+
24182
@Test
25183
void isVisibleAndIsHiddenShouldWork() {
26184
page.setContent("<div>Hi</div><span></span>");

0 commit comments

Comments
 (0)