在 puppeteer 的 headless true 模式下找不到选择器的节点
No node found for selector in headless true mode of puppeteer
我的环境:
- 人偶版本:1.20.0
- 平台/OS 版本:Ubuntu 18.04.3 LTS
- Node.js版本:8.10.0
- Chrome/78.0.3882.0
此错误内容打印在终端:
(node:18157) UnhandledPromiseRejectionWarning: Error: No node found for selector: #identifierNext
at assert (/home/hoangdd3/node_modules/puppeteer/lib/helper.js:279:11)
at DOMWorld.click (/home/hoangdd3/node_modules/puppeteer/lib/DOMWorld.js:366:5)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
-- ASYNC --
at Frame.<anonymous> (/home/hoangdd3/node_modules/puppeteer/lib/helper.js:111:15)
at Page.click (/home/hoangdd3/node_modules/puppeteer/lib/Page.js:1037:29)
at puppeteer.launch.then (/home/hoangdd3/pupperteer/example.js:15:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:18157) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:18157) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
这是我的代码:
const puppeteer = require('puppeteer');
puppeteer.launch({
headless: true
}).then(async browser => {
const page = await browser.newPage();
await page.setViewport({width: 1920, height: 1080});
await page.goto('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin', {"waitUntil" : "networkidle0"});
await page.waitFor(2000);
await page.click('input[type=email]');
await page.keyboard.sendCharacter('phamvancuong4584sg@gmail.com');
await page.click('#identifierNext');
await page.waitFor(2000);
await page.evaluate(() => document.querySelector('#password > div > div > div > input').click());
await page.keyboard.sendCharacter('test');
await page.evaluate(() => document.querySelector('#passwordNext').click());
await page.screenshot({path: 'example.png'});
await browser.close();
});
看起来 await page.click('#identifierNext');
中没有 id=identifierNext
的元素
代替 await page.click('#identifierNext');
尝试使用
const next = await page.waitForSelector('#identifierNext');
await next.click();
不同 click('#identifierNext')
waitForSelector and click
waitForSelector - 可以等待元素 30,000 秒以将元素添加到 DOM
click - 如果现在 DOM 中没有元素,click 将拒绝 Promise
您面临的问题与选择器有关,它们根本不存在 :)。 html 在 headless: true
中提供的服务与在 headless: false
中提供的服务不同
您的代码段在 headless: false
上使用时可以正常工作
有代码可以在 headless: true
中使用
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
});
const page = await browser.newPage();
await page.goto('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin', {"waitUntil" : "networkidle0"});
await page.waitFor(2000);
await page.click('#Email');
await page.keyboard.sendCharacter('phamvancuong4584sg@gmail.com');
await page.click('#next');
await page.waitFor(2000);
await page.click('#Passwd');
await page.keyboard.sendCharacter('test');
await page.click('#signIn');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
在屏幕上 example.png
您可以看到密码不正确的信息(测试)。
我的环境:
- 人偶版本:1.20.0
- 平台/OS 版本:Ubuntu 18.04.3 LTS
- Node.js版本:8.10.0
- Chrome/78.0.3882.0
此错误内容打印在终端:
(node:18157) UnhandledPromiseRejectionWarning: Error: No node found for selector: #identifierNext
at assert (/home/hoangdd3/node_modules/puppeteer/lib/helper.js:279:11)
at DOMWorld.click (/home/hoangdd3/node_modules/puppeteer/lib/DOMWorld.js:366:5)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
-- ASYNC --
at Frame.<anonymous> (/home/hoangdd3/node_modules/puppeteer/lib/helper.js:111:15)
at Page.click (/home/hoangdd3/node_modules/puppeteer/lib/Page.js:1037:29)
at puppeteer.launch.then (/home/hoangdd3/pupperteer/example.js:15:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:18157) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:18157) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
这是我的代码:
const puppeteer = require('puppeteer');
puppeteer.launch({
headless: true
}).then(async browser => {
const page = await browser.newPage();
await page.setViewport({width: 1920, height: 1080});
await page.goto('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin', {"waitUntil" : "networkidle0"});
await page.waitFor(2000);
await page.click('input[type=email]');
await page.keyboard.sendCharacter('phamvancuong4584sg@gmail.com');
await page.click('#identifierNext');
await page.waitFor(2000);
await page.evaluate(() => document.querySelector('#password > div > div > div > input').click());
await page.keyboard.sendCharacter('test');
await page.evaluate(() => document.querySelector('#passwordNext').click());
await page.screenshot({path: 'example.png'});
await browser.close();
});
看起来 await page.click('#identifierNext');
中没有 id=identifierNext
代替 await page.click('#identifierNext');
尝试使用
const next = await page.waitForSelector('#identifierNext');
await next.click();
不同 click('#identifierNext')
waitForSelector and click
waitForSelector - 可以等待元素 30,000 秒以将元素添加到 DOM
click - 如果现在 DOM 中没有元素,click 将拒绝 Promise
您面临的问题与选择器有关,它们根本不存在 :)。 html 在 headless: true
中提供的服务与在 headless: false
您的代码段在 headless: false
有代码可以在 headless: true
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
});
const page = await browser.newPage();
await page.goto('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin', {"waitUntil" : "networkidle0"});
await page.waitFor(2000);
await page.click('#Email');
await page.keyboard.sendCharacter('phamvancuong4584sg@gmail.com');
await page.click('#next');
await page.waitFor(2000);
await page.click('#Passwd');
await page.keyboard.sendCharacter('test');
await page.click('#signIn');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
在屏幕上 example.png
您可以看到密码不正确的信息(测试)。