Кукольник не может нажать кнопку «Разрешить» на странице согласия Google - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь использовать puppeteer для входа на страницу авторизации Google.До сих пор я смог заставить кукловода успешно ввести имя пользователя, пароль и 2FA.Затем меня перенаправляют на эту страницу согласия Google

enter image description here

Но кукловод не может нажать кнопку «Разрешить» и выдает следующую ошибку:

typing email...
clicking next button...
waiting for password field...
typing password...
clicking next button...
waiting for consent approval...
clicking Allow button...
(node:87043) UnhandledPromiseRejectionWarning: Error: No node found for selector: #submit_approve_access
    at assert (/Users/mohamed/projects/googleAuth/api/src/test/resources/dev-tools/node_modules/puppeteer/lib/helper.js:278:11)
    at Frame.click (/Users/mohamed/projects/googleAuth/api/src/test/resources/dev-tools/node_modules/puppeteer/lib/FrameManager.js:736:5)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
  -- ASYNC --
    at Frame.<anonymous> (/Users/mohamed/projects/googleAuth/api/src/test/resources/dev-tools/node_modules/puppeteer/lib/helper.js:144:27)
    at Page.click (/Users/mohamed/projects/googleAuth/api/src/test/resources/dev-tools/node_modules/puppeteer/lib/Page.js:973:29)
    at doLogin (/Users/mohamed/projects/googleAuth/api/src/test/resources/dev-tools/routes/index.js:177:16)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
(node:87043) 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:87043) [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.

Ниже приведен код Node.js, который я написал:

async function doLogin(authorizeUrl) {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.goto(authorizeUrl);
    await page.mainFrame().waitForSelector('#identifierId');
    console.log('typing email...');
    await page.type('#identifierId', googleCredentials.username);
    await page.mainFrame().waitForSelector('#identifierNext');
    console.log('clicking next button...');
    await page.click('#identifierNext');
    console.log('waiting for password field...');
    await page
        .mainFrame()
        .waitForSelector('#password input[type="password"]', {visible: true});
    console.log('typing password...');
    await page.type('#password input[type="password"]', googleCredentials.password, {
        delay: 100,
    });
    console.log('clicking next button...');
    await page.click('#passwordNext', {delay: 100});
    console.log('waiting for consent approval...');
    console.log('clicking Allow button...');
    await page.click('#submit_approve_access', {delay: 100});
    return browser;
}

1 Ответ

3 голосов
/ 03 июня 2019

Кнопка еще не доступна, когда вы нажимаете на нее.Вероятно, это так, потому что, когда вы нажимаете кнопку #passwordNext, страница выполняет асинхронное действие, которое может занять несколько миллисекунд, возможно, сетевой запрос, возможно, просто некоторые вычисления.Поэтому, не дожидаясь, когда вы звоните page.click, кнопка не нажимается.

Решение

Вы можете добавить следующую строку перед вызовом page.click, чтобы сделатьуверен, что кнопка действительно присутствует на странице:

await page.waitForSelector('#submit_approve_access');
...