Явное ожидание селектора не работает? - PullRequest
0 голосов
/ 04 мая 2019

Я пишу код для входа в Gmail.На странице паролей вместо неявного ожидания я хочу использовать явное ожидание.Тем не менее, он не поднимает мой селектор?

(async () => {
const browser = await puppeteer.launch({
    headless: false
});
const page = await browser.newPage();

await page.goto('https://accounts.google.com/');
await page.$('#identifierId');
await page.keyboard.type('Test1234');
await page.click('#identifierNext > content > span');

await page.waitForSelector('#password'); //this doesnt work
// await page.waitFor(5000); this works
await page.$('#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input');
await page.keyboard.type('fakePassword');
await page.click('#passwordNext > content');
);

Я получаю сообщение об ошибке:

(узел: 14428) UnhandledPromiseRejectionWarning: Ошибка: узел либо не виден, либоне HTMLElement в ElementHandle._clickablePoint (/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/JSHandle.js:199:13) в processTicksAndRejection (внутренняя / process / next_tick.js: 81: 5) - ASYNC- в ElementHandle.(/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/helper.js:110:27) в DOMWorld.click (/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/DOMWorld.js:367:18) в processTicksAndRejected (внутренняя / process / next_tick.js: 81: 5) - ASYNC - в кадре.(/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/helper.js:110:27) в Page.click (/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/Page.js:988:29) в /Users/asd/Projects/FreeRazor/app.js:19:16 в processTicksAndRejected (внутренний / process / next_tick.js: 81: 5) (узел: 14428) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 1) (узел: 14428) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

1 Ответ

0 голосов
/ 04 мая 2019

Оператор page.waitForSelector работает.Проблема вызвана одним из вызовов page.click.

Соответствующая часть сообщения об ошибке:

(node:14428) UnhandledPromiseRejectionWarning: Error: Node is either not visible or not an HTMLElement
    [...]
    at Page.click (/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/Page.js:988:29)
    at /Users/asd/Projects/FreeRazor/app.js:19:16

Таким образом, ошибка возникает в строке 19. Я неЯ точно не знаю, какая это строка, но я предполагаю, что это последний вызов page.click, поскольку вы говорите, что код работает, если вы дольше ждете (page.waitFor(5000)).Таким образом, кажется, что страница отображает элемент #passwordNext > content DOM дольше, чем элемент #password.

Решение

Вы можете решить эту проблему, поставив еще один waitForSelector перед щелчкомчтобы убедиться, что элемент действительно существует.Я даже добавил опцию { visible: true }, чтобы убедиться, что узел DOM также виден:

await page.waitForSelector('#passwordNext > content', { visible: true });
await page.click('#passwordNext > content');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...