Как удалить существующий текст из ввода с помощью Puppeteer?
Я пытаюсь проверить исправление текста в редактируемом вводе, который содержит заголовок текущей записи - и я хочу иметь возможность проверить редактирование такого текста, заменив его чем-то другим.
Я знаю, что могу использовать await page.type('#inputID', 'blah');
чтобы вставить "бла" в текстовое поле (которое в моем случае, при наличии существующего текста, добавляет только "бла"), однако, я не могу найти какие-либо методы страницы 1, которые позволяют удалять или заменять существующий текст.
Ответы
Ответ 1
Вы можете использовать page.evaluate
для управления DOM по своему усмотрению:
await page.evaluate( () => document.getElementById("inputID").value = "")
Однако иногда простого манипулирования данным полем может быть недостаточно (целевой страницей может быть SPA с прослушивателями событий), поэтому эмуляция реальных нажатий клавиш предпочтительнее. Приведенные ниже примеры взяты из информативного вопроса кукловода Github, касающегося этой задачи.
Здесь мы нажимаем клавишу Backspace
столько раз, сколько символов в этом поле:
const inputValue = await page.$eval('#inputID', el => el.value);
for (let i = 0; i < inputValue.length; i++) {
await page.press('Backspace');
}
Другое интересное решение состоит в том, чтобы щелкнуть целевое поле 3 раза, чтобы браузер выделил весь текст в нем, а затем вы можете просто напечатать, что вы хотите:
const input = await page.$('#inputID');
await input.click({ clickCount: 3 })
await input.type("Blah");
Ответ 2
Вы можете использовать методы page.keyboard
для изменения входных значений или использовать page.evaluate()
.
Заменить весь текст:
// Using page.keyboard:
await page.focus( '#example' );
await page.keyboard.down( 'Control' );
await page.keyboard.press( 'A' );
await page.keyboard.up( 'Control' );
await page.keyboard.press( 'Backspace' );
await page.keyboard.type( 'foo' );
// Using page.evaluate:
await page.evaluate( () => {
const example = document.getElementById( 'example' );
example.value = 'foo';
});
Добавить текст:
// Using page.keyboard:
await page.focus( '#example' );
await page.keyboard.press( 'End' );
await page.keyboard.type( ' bar qux' );
// Using page.evaluate:
await page.evaluate( () => {
const example = document.getElementById( 'example' );
example.value += ' bar qux';
});
Backspace Последний персонаж:
// Using page.keyboard:
await page.focus( '#example' );
await page.keyboard.press( 'End' );
await page.keyboard.press( 'Backspace' );
// Using page.evaluate:
await page.evaluate( () => {
const example = document.getElementById( 'example' );
example.value = example.value.slice( 0, -1 );
});
Удалить первый символ:
// Using page.keyboard:
await page.focus( '#example' );
await page.keyboard.press( 'Home' );
await page.keyboard.press( 'Delete' );
// Using page.evaluate:
await page.evaluate( () => {
const example = document.getElementById( 'example' );
example.value = example.value.slice( 1 );
});
Ответ 3
Если вы не заинтересованы в симуляции ключевых событий, вы также можете использовать метод puppeteer page. $ Eval как краткое средство для удаления значения textarea...
await page.$eval('#inputID', el => el.value = '');
await page.type('#inputID', 'blah');
или даже полностью заменить значение за один шаг, не имитируя последующего набора:
await page.$eval('#inputID', el => el.value = 'blah');
Ответ 4
Приведенные выше ответы имеют проблемы ESLint.
следующее решение, передающее изменение ESLint:
await page.evaluate(
(selector) => { (document.querySelector(selector).value = ''); },
inputBoxSelector,
);
Ответ 5
Ну, причина, по которой вы хотите удалить существующий текст, обычно может заключаться в том, чтобы заменить его.
Вы можете использовать page.evalute
let title = getTitle()
let selector = getSelector()
await page.evaluate(
({selector, title}) => {
let el = document.querySelector(selector)
if ('value' in el) el.value = title
else el.innerText = title
},
{selector, title}
)