Я использую puppeteer, pptr-testing-library, и я пытаюсь открыть веб-сайт Google и ввести в поиск «учебники», и после этого я хочу проверить, что значение на входе такое же, как я набираю «учебники». но я получаю сообщение об ошибке
Unable to find an element with the text: tutorials".
Код:
import { PuppeteerScreenRecorder } from "puppeteer-screen-recorder";
import puppeteer, { Browser, ElementHandle, Page } from "puppeteer";
import { getDocument, queries } from "pptr-testing-library";
const { findByRole } = queries;
let page, recorder, browser;
beforeAll(async () => {
browser = await puppeteer.launch({
headless: true,
});
page = await browser.newPage();
recorder = new PuppeteerScreenRecorder(page);
await recorder.start(`./screenshots/e2e-test-${Date.now()}.mp4`);
await page.goto("https://www.google.com");
console.info({ page });
});
describe("type in search input", () => {
it("should check search input value", async () => {
console.info("enter test");
const $document = await getDocument(page);
console.info("doc is", $document);
const $searchInput = await findByRole($document, "combobox");
await $searchInput.type("tutorials");
console.info({ $searchInput });
expect(await queries.findAllByText($document, 'tutorials"')).toBeTruthy();
await recorder.stop();
await browser.close();
});
});
Кроме того, когда я печатаю журналы doc и searchInput, я получаю пустой объект:
Как получить значение ввода после ввода?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В следующей строке кода есть опечатка:
expect(await queries.findAllByText($document, 'tutorials"')).toBeTruthy();
Обратите внимание на «лишние» двойные кавычки: 'tutorials"'.
Обратите внимание, что сообщение об ошибке также содержит «лишнюю» двойную кавычку:
Оценка не удалась: ошибка: не удалось найти элемент с текстом: учебники». Это может быть связано с тем, что текст разбит на несколько элементов. В этом случае вы можете предоставить функцию для вашего текстового сопоставителя, чтобы сделать его более гибким.
Исправьте строку, убрав «лишнюю» двойную кавычку:
expect(await queries.findAllByText($document, 'tutorials')).toBeTruthy();
Было бы лучше извлечь и повторно использовать константу. Например:
<…>
const searchInputString = 'tutorials';
await $searchInput.type(searchInputString);
<…>
expect(await queries.findAllByText($document, searchInputString)).toBeTruthy();
<…>
Как получить значение ввода после ввода?
как я могу получить значение из searchInput?
Метод Page.evaluate() можно использовать для получения значений свойств элемента.
Например, чтобы получить значение свойства value элемента ввода:
const expectedSearchInputValue = 'tutorials';
await $searchInput.type(expectedSearchInputValue);
const searchInputValue = await page.evaluate(element => element.value, $searchInput);
console.info("Search input value:", searchInputValue);
expect(searchInputValue).toEqual(expectedSearchInputValue);
Обратите внимание на аргумент вызова метода Page.evaluate() — стрелочную функцию.
element функции стрелки является экземпляром интерфейса HTMLInputElement, поскольку дескриптор элемента соответствует элементу ввода.а почему searchInput в пустом объекте?
Так как:
$searchInput содержит экземпляр класса ElementHandle.Уважаемый @Manspof, пожалуйста, ознакомьтесь с обновленным ответом. Обратите внимание на раздел «Ответы на вопросы».
отлично .. спасибо .. вы можете увидеть мой другой вопрос, связанный с кукольником?stackoverflow.com/questions/73803974/…
**Hope it helps,
Just set the value of input like this:(Example**
await page.$eval('#email', el => el.value = '[email protected]');
**Here is an example of using it on Wikipedia:**
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://en.wikipedia.org', {waitUntil: 'networkidle2'});
await page.waitFor('input[name=search]');
// await page.type('input[name=search]', 'Adenosine triphosphate');
await page.$eval('input[name=search]', el => el.value = 'Adenosine triphosphate');
await page.click('input[type = "submit"]');
await page.waitForSelector('#mw-content-text');
const text = await page.evaluate(() => {
const anchor = document.querySelector('#mw-content-text');
return anchor.textContent;
});
console.info(text);
await browser.close();
})();
Thank You!!
Привет Пр_вен! При работе с элементом Input единственной важной частью является свойство «значение». Только элемент ввода содержит такое свойство. Работать с textContent/innerText/innerHTML довольно рискованно. Кроме того, существует большая разница между innerText и textContent: developer.mozilla.org/en-US/docs/Web/API/Node/textContent О значении и innerText читайте stackoverflow.com/a/63179925/10413416 этот ответ, суммируйте очень хорошую разницу. Поэтому я бы изменил anchor.textContent на получение значения входного элемента по его свойству.
сергей, правильно.. в дополнение к вопросам, как я могу получить значение из searchInput? а почему searchInput в пустом объекте?