提问者:小点点

显式等待选择器不工作?


我正在写一段代码来登录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:错误:processTicksAndRejections(internal/process/next_tick.js:81:5)处的elementHandle._clickablePoint(/users/asd/projects/freerAzor/node_modules/puppeteer/lib/jshandle.js:199:13)处的节点不可见或不是HTMLElement--异步--在elementHandle处。(/users/asd/projects/freerazor/node_modules/puppeteer/lib/helper.js:110:27)在domworld。单击(/users/asd/projects/freerazor/node_modules/puppeteer/lib/domworld.js:367:18)在processTicksAndRejections(internal/process/next_tick.js:81:5)--异步--在帧。(/users/asd/projects/freerazor/node_modules/puppeteer/lib/helper.js:110:27)在page.点击(/users/asd/projects/freerazor/node_modules/puppeteer/lib/page.js:988:29)在/users/asd/projects/freerazor/app.js:19:16在processTicksAndRejections(internal/process/next_tick.js:81:5)(节点:14428)未处理的processerejectionwarning:未处理的承诺拒绝。这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:1)(节点:14428)[DEP0018]拒绝警告:不推荐未处理得承诺拒绝.将来,未处理的承诺拒绝将以非零退出代码终止node.js进程。


共1个答案

匿名用户

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>ContentDOM元素所需的页面时间似乎比显示#Password元素所需的时间长。

您可以通过在单击之前放置另一个WaitForSelector来解决此问题,以确保元素实际存在。我甚至添加了{visible:true}选项来确保DOM节点也是可见的:

await page.waitForSelector('#passwordNext > content', { visible: true });
await page.click('#passwordNext > content');