Проблема с нажатием кукловода на выпадающее меню

#javascript #json #npm #puppeteer

#javascript #json #npm #кукловод

Вопрос:

Я использую puppeteer для создания бота, который может проверять мою домашнюю работу в колледже. Я хочу, чтобы puppeteer выполнил те же действия, что и я, чтобы проверить, есть ли у меня домашнее задание, и часть этого включает выпадающее меню, которое мне нужно, чтобы puppeteer щелкнул, чтобы продолжить — однако он не нажимает на него и вместо этого выдает мне ошибку в терминале.

Это код, который я написал (это не полный код, но это первый момент, когда произошла ошибка, поэтому ее решение предотвратит проблему):

 const puppeteer = require("puppeteer");

async function checkHomeWork() {
    const browser = puppeteer.launch({ headless: false, defaultViewport: null });
    const page = (await browser).newPage();
    const url = "https://www.jce.ac.il/";
    (await page).goto(url);
    (await page).waitForTimeout(10000);

    const dropDown = (await page).$("#infostation-dd-trigger");
    (await dropDown).click();
    (await page).waitForTimeout(5000);
}

checkHomeWork();
 

Это ошибка, которую я получаю в терминале при запуске этого кода через node app.js :

 (node:16992) UnhandledPromiseRejectionWarning: Error: Execution context was destroyed, most likely because of a navigation.
    at rewriteError (C:UsersmiladDesktopNew foldernode_modulespuppeteerlibcjspuppeteercommonExecutionContext.js:261:23)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async ExecutionContext._evaluateInternal (C:UsersmiladDesktopNew foldernode_modulespuppeteerlibcjspuppeteercommonExecutionContext.js:161:64)
    at async C:UsersmiladDesktopNew foldernode_modulespuppeteerlibcjspuppeteercommonDOMWorld.js:102:30
    at async DOMWorld.$ (C:UsersmiladDesktopNew foldernode_modulespuppeteerlibcjspuppeteercommonDOMWorld.js:122:26)
    at async checkHomeWork (C:UsersmiladDesktopNew folderapp.js:12:6)
(node:16992) 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:16992) [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:

Вы пытаетесь щелкнуть до того, как элемент был загружен. Изменить на:

 const puppeteer = require('puppeteer');

puppeteer.launch({ headless: false, defaultViewport: null }).then(async browser => {
  const page = await browser.newPage();
  const url = "https://www.jce.ac.il/";
  await page.goto(url);
  page
    .waitForSelector('#infostation-dd-trigger')
    .then(() => {
        // Rest of the logic here.
     });
    browser.close();
});
 

Комментарии:

1. теперь я получаю сообщение об ошибке типа page.$ не является функцией

2. .then() не позволяет мне ничего делать внутри него, я не могу выполнить вызов click, и я не могу объявить функцию, и я не могу описать селектор с помощью page .$

3. у вас есть другой способ решения этой проблемы