我正在写一段代码来登录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进程。
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');