mirror of
https://github.com/microsoft/playwright-java.git
synced 2025-09-08 21:01:00 +00:00
test: convert page-fill.spec.ts
This commit is contained in:
parent
d6727eed34
commit
d35b1b74e1
281
lib/src/test/java/com/microsoft/playwright/TestPageFill.java
Normal file
281
lib/src/test/java/com/microsoft/playwright/TestPageFill.java
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.microsoft.playwright;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
public class TestPageFill {
|
||||||
|
private static Server server;
|
||||||
|
private static Browser browser;
|
||||||
|
private static boolean isChromium;
|
||||||
|
private static boolean isWebKit;
|
||||||
|
private static boolean isFirefox;
|
||||||
|
private BrowserContext context;
|
||||||
|
private Page page;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void launchBrowser() {
|
||||||
|
Playwright playwright = Playwright.create();
|
||||||
|
BrowserType.LaunchOptions options = new BrowserType.LaunchOptions();
|
||||||
|
browser = playwright.chromium().launch(options);
|
||||||
|
isChromium = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void startServer() throws IOException {
|
||||||
|
server = new Server(8907);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
static void stopServer() throws IOException {
|
||||||
|
browser.close();
|
||||||
|
server.stop();
|
||||||
|
server = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
context = browser.newContext();
|
||||||
|
page = context.newPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void tearDown() {
|
||||||
|
context.close();
|
||||||
|
context = null;
|
||||||
|
page = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillTextarea() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
page.fill("textarea", "some value");
|
||||||
|
assertEquals("some value", page.evaluate("() => window['result']"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillInput() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
page.fill("input", "some value");
|
||||||
|
assertEquals("some value", page.evaluate("() => window['result']"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldThrowOnUnsupportedInputs() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
for (String type : new String[]{"color", "file"}) {
|
||||||
|
page.evalOnSelector("input", "(input, type) => input.setAttribute('type', type)", type);
|
||||||
|
try {
|
||||||
|
page.fill("input", "");
|
||||||
|
fail("fill should throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("input of type \"" + type + "\" cannot be filled"), e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillDifferentInputTypes() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
for (String type : new String[]{"password", "search", "tel", "text", "url"}) {
|
||||||
|
page.evalOnSelector("input", "(input, type) => input.setAttribute('type', type)", type);
|
||||||
|
page.fill("input", "text " + type);
|
||||||
|
assertEquals("text " + type, page.evaluate("() => window['result']"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillDateInputAfterClicking() {
|
||||||
|
page.setContent("<input type=date>");
|
||||||
|
page.click("input");
|
||||||
|
page.fill("input", "2020-03-02");
|
||||||
|
assertEquals("2020-03-02", page.evalOnSelector("input", "input => input.value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldThrowOnIncorrectDate() {
|
||||||
|
// TODO: test.skip(browserName === "webkit");
|
||||||
|
page.setContent("<input type=date>");
|
||||||
|
try {
|
||||||
|
page.fill("input", "2020-13-05");
|
||||||
|
fail("did not throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("Malformed value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillTimeInput() {
|
||||||
|
page.setContent("<input type=time>");
|
||||||
|
page.fill("input", "13:15");
|
||||||
|
assertEquals("13:15", page.evalOnSelector("input", "input => input.value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldThrowOnIncorrectTime() {
|
||||||
|
// TODO: test.skip(browserName === "webkit");
|
||||||
|
page.setContent("<input type=time>");
|
||||||
|
try {
|
||||||
|
page.fill("input", "25:05");
|
||||||
|
fail("did not throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("Malformed value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillDatetimeLocalInput() {
|
||||||
|
page.setContent("<input type=datetime-local>");
|
||||||
|
page.fill("input", "2020-03-02T05:15");
|
||||||
|
assertEquals(page.evalOnSelector("input", "input => input.value"), "2020-03-02T05:15");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldThrowOnIncorrectDatetimeLocal() {
|
||||||
|
// TODO: test.skip(browserName === "webkit" || browserName === "firefox");
|
||||||
|
page.setContent("<input type=datetime-local>");
|
||||||
|
try {
|
||||||
|
page.fill("input", "abc");
|
||||||
|
fail("did not throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("Malformed value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillContenteditable() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
page.fill("div[contenteditable]", "some value");
|
||||||
|
assertEquals(page.evalOnSelector("div[contenteditable]", "div => div.textContent"), "some value");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillElementsWithExistingValueAndSelection() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
|
||||||
|
page.evalOnSelector("input", "input => input.value = 'value one'");
|
||||||
|
page.fill("input", "another value");
|
||||||
|
assertEquals("another value", page.evaluate("() => window['result']"));
|
||||||
|
|
||||||
|
page.evalOnSelector("input", "input => {\n" +
|
||||||
|
" input.selectionStart = 1;\n" +
|
||||||
|
" input.selectionEnd = 2;\n" +
|
||||||
|
"}");
|
||||||
|
page.fill("input", "maybe this one");
|
||||||
|
assertEquals("maybe this one", page.evaluate("() => window['result']"));
|
||||||
|
|
||||||
|
page.evalOnSelector("div[contenteditable]", "div => {\n" +
|
||||||
|
" div.innerHTML = 'some text <span>some more text<span> and even more text';\n" +
|
||||||
|
" const range = document.createRange();\n" +
|
||||||
|
" range.selectNodeContents(div.querySelector('span'));\n" +
|
||||||
|
" const selection = window.getSelection();\n" +
|
||||||
|
" selection.removeAllRanges();\n" +
|
||||||
|
" selection.addRange(range);\n" +
|
||||||
|
"}");
|
||||||
|
page.fill("div[contenteditable]", "replace with this");
|
||||||
|
assertEquals("replace with this", page.evalOnSelector("div[contenteditable]", "div => div.textContent"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldThrowWhenElementIsNotAnInputTextareaOrContenteditable() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
try {
|
||||||
|
page.fill("body", "");
|
||||||
|
fail("did not throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("Element is not an <input>"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void shouldThrowIfPassedANonStringValue() {
|
||||||
|
// Doesn't make sense in a strongly typed language
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: not supported in sync api, tests internals
|
||||||
|
void shouldRetryOnDisabledElement() {
|
||||||
|
}
|
||||||
|
void shouldRetryOnInvisibleElement() {
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToFillTheBody() {
|
||||||
|
page.setContent("<body contentEditable='true'></body>");
|
||||||
|
page.fill("body", "some value");
|
||||||
|
assertEquals("some value", page.evaluate("() => document.body.textContent"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldFillFixedPositionInput() {
|
||||||
|
page.setContent("<input style='position: fixed;' />");
|
||||||
|
page.fill("input", "some value");
|
||||||
|
assertEquals("some value", page.evaluate("() => document.querySelector('input').value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToFillWhenFocusIsInTheWrongFrame() {
|
||||||
|
page.setContent("<div contentEditable='true'></div>\n" +
|
||||||
|
"<iframe></iframe>");
|
||||||
|
page.focus("iframe");
|
||||||
|
page.fill("div", "some value");
|
||||||
|
assertEquals("some value", page.evalOnSelector("div", "d => d.textContent"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToFillTheInputTypeNumber() {
|
||||||
|
page.setContent("<input id='input' type='number'></input>");
|
||||||
|
page.fill("input", "42");
|
||||||
|
assertEquals("42", page.evaluate("() => window['input'].value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToFillExponentIntoTheInputTypeNumber() {
|
||||||
|
page.setContent("<input id='input' type='number'></input>");
|
||||||
|
page.fill("input", "-10e5");
|
||||||
|
assertEquals("-10e5", page.evaluate("() => window['input'].value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToFillInputTypeNumberWithEmptyString() {
|
||||||
|
page.setContent("<input id='input' type='number' value='123'></input>");
|
||||||
|
page.fill("input", "");
|
||||||
|
assertEquals("", page.evaluate("() => window['input'].value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldNotBeAbleToFillTextIntoTheInputTypeNumber() {
|
||||||
|
page.setContent("<input id='input' type='number'></input>");
|
||||||
|
try {
|
||||||
|
page.fill("input", "abc");
|
||||||
|
fail("did not throw");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
assertTrue(e.getMessage().contains("Cannot type text into input[type=number]"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldBeAbleToClear() {
|
||||||
|
page.navigate(server.PREFIX + "/input/textarea.html");
|
||||||
|
page.fill("input", "some value");
|
||||||
|
assertEquals("some value", page.evaluate("() => window['result']"));
|
||||||
|
page.fill("input", "");
|
||||||
|
assertEquals("", page.evaluate("() => window['result']"));
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user