4

My enviroment:

  • Puppeteer version: 1.20.0
  • Platform / OS version: Ubuntu 18.04.3 LTS
  • Node.js version: 8.10.0
  • Chrome/78.0.3882.0

This error content was printed in terminal:

(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.

This my 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();
});
Hoang
  • 829
  • 11
  • 18
  • I have the same issue as you. Please advise if you've solved it. I believe there must be some sort of obfuscation to prevent clicking this button. – user2481095 Nov 06 '19 at 23:41
  • 1
    @user2481095: please refer below answer of domlas. i do same that and success. – Hoang Nov 07 '19 at 08:52

2 Answers2

5

the problem you are facing refers to selectors, they simply do not exist :). html served in headless: true is different to the one on headless: false

Your snippet works correctly when used on headless: false

There is code which will work in 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();
})();

On screen example.png you can see info with incorrect password (test).

domlas
  • 173
  • 7
  • 1
    For `headless: true` how do you determine the selector (ie `page.click('#next')`? – Riza Khan Feb 23 '20 at 15:16
  • @RizaKhan at given time i did it in some hacky way using docker and connecting to chrome instance via active web socket. There's ofc faster way to get DOM for headless google page. Take a look at: https://developers.google.com/web/updates/2017/04/headless-chrome – domlas Feb 24 '20 at 12:51
  • 1
    `await page.waitFor(2000);` is a poor solution -- this is a race condition that might incorrectly stop blocking before the selector is visible, or blocks longer than necessary. `waitForSelector` (or the more general `waitForFunction`) is the preferred approach for a tightly bound loop on visibility of an element. – ggorlen Nov 26 '21 at 17:09
0

Looks like in await page.click('#identifierNext'); theare no element with id=identifierNext

insted of await page.click('#identifierNext');

try to use

const next = await page.waitForSelector('#identifierNext');
await next.click();

Different betwen click('#identifierNext') waitForSelector and click

waitForSelector - can wait for an element for 30,000s to add an element to DOM

click - if there no element in DOM right now, click will reject Promise

dmowski
  • 106
  • 1
  • 3