我正在编写代码以登录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进程。
答案 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');