Не удалось войти в Nitrado с помощью кукловода - PullRequest
0 голосов
/ 21 июня 2020
const puppeteer = require('puppeteer');

const nitrLogin = async (username) => {
    const browser = await puppeteer.launch( { headless: false });
    const page = await browser.newPage();

    await page.goto('https://server.nitrado.net/usa');


    // Login form
    await page.$$eval('selector', selectorMatched => {
    for(i in selectorMatched)
      if(selectorMatched[i].textContent === 'login'){
          selectorMatched[i].click();
          break;//Remove this line (break statement) if you want to click on all matched elements otherwise the first element only is clicked
        }
    });

    await page.type('[name=_username]', '<USERNAME>');

    await page.type('[name=_password]', '<PASSWORD>');

    await page.click('[type=submit]');

    // Social Page

    await page.waitFor(5000);

    await browser.close
}
nitrLogin();

Сейчас я ищу способ войти в nitrado, используя puppeteer, но продолжаю получать эту ошибку:

(node:12888) UnhandledPromiseRejectionWarning: Error: No node found for selector: [name=username]
    at Object.assert (C:\Users\Owner\Desktop\TGG Bot\node_modules\puppeteer\lib\helper.js:29:15)
    at DOMWorld.type (C:\Users\Owner\Desktop\TGG Bot\node_modules\puppeteer\lib\DOMWorld.js:291:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async nitrLogin (C:\Users\Owner\Desktop\TGG Bot\test.js:19:5)
  -- ASYNC --
    at Frame.<anonymous> (C:\Users\Owner\Desktop\TGG Bot\node_modules\puppeteer\lib\helper.js:94:19)
    at Page.type (C:\Users\Owner\Desktop\TGG Bot\node_modules\puppeteer\lib\Page.js:793:33)
    at nitrLogin (C:\Users\Owner\Desktop\TGG Bot\test.js:19:16)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:12888) 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(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:12888) [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.

1 Ответ

0 голосов
/ 21 июня 2020

Некоторые настройки:

  1. Ссылка для входа появляется, если defaultViewport не задано (опция по умолчанию).
  2. textContent равно 'Login', а не 'login';
  3. Вам нужно дождаться элементов, которые появятся динамически после взаимодействий внутри page.evaluate().
  4. Форма входа находится внутри iframe, поэтому вам нужно дождаться этого iframe и использовать его вместо page.
const puppeteer = require('puppeteer');

const nitrLogin = async (username) => {
    // adjustment 1:
    const browser = await puppeteer.launch({ headless: false, defaultViewport: null, args: ['--start-maximized'] });
    const page = await browser.newPage();

    await page.goto('https://server.nitrado.net/usa');

    await page.$$eval('*', selectorMatched => {
      for(i in selectorMatched)
        // adjustment 2:
        if(selectorMatched[i].textContent === 'Login'){
          selectorMatched[i].click();
          break;
        }
    });

    // adjustments 3-4:
    await page.waitForSelector('iframe[src^="https://oauth.nitrado.net/oauth/v2/auth"]');
    const loginFrame = await (await page.$('iframe[src^="https://oauth.nitrado.net/oauth/v2/auth"]')).contentFrame();
    await loginFrame.waitForSelector('[name=_username]');

    await loginFrame.type('[name=_username]', '<USERNAME>');
    await loginFrame.type('[name=_password]', '<PASSWORD>');
    await loginFrame.click('[type=submit]');
}

nitrLogin();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...