明确等待选择器不起作用?

时间:2019-05-04 17:23:21

标签: node.js puppeteer

我正在编写代码以登录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)       在processTicksAndRejections(内部/进程/next_tick.js:81:5)     -异步-       在ElementHandle。 (/用户/ asd /项目/FreeRazor/node_modules/puppeteer/lib/helper.js:110:27)       在DOMWorld.click(/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/DOMWorld.js:367:18)       在processTicksAndRejections(内部/进程/next_tick.js:81:5)     -异步-       在帧。 (/用户/ asd /项目/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       在processTicksAndRejections(内部/进程/next_tick.js:81:5)   (节点:14428)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)   (节点:14428)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

1 个答案:

答案 0 :(得分:0)

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');