кукловод: используйте внешнюю функцию с взаимодействием с домом

С помощью инструмента разработчика chrome test puppeteer я хочу установить и использовать внешнюю функцию

  const puppeteer = require('puppeteer');

    async function setSelectVal(page, sel, val) {
        page.evaluate((data) => {
            return document.querySelector(data.sel).value = data.val
        }, {sel, val})
    }

 (async () => {
   const browser = await puppeteer.launch({headless: false});
   const page = await browser.newPage();
   await page.goto('url',  {waitUntil: 'load'});

  const inputLogin = await page.$('input[name=login]');
  await page.focus('input[name=login]');
  await page.type('login',  {delay: 100});

  const inputPassord = await page.$('input[name=password]');
  await inputPassord.click();
  await page.type('pass', {delay: 100});

  const inputValidate = await page.$('input[name=valid]');
  await inputValidate.click();

  await page.waitForSelector('td.newpageclass');

  await setSelectVal(page, 'select[name=targetname]', 'targetvalue')
 })();

но это вызывает ошибку:

(узел: 16312) UnhandledPromiseRejectionWarning: отклонение необработанного обещания (идентификатор отклонения: 1): ошибка: ошибка протокола (Runtime.evaluate): цель закрыта. (узел: 16312) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода.

Ты знаешь, как мне поступить?


person Vivien Pipo    schedule 24.09.2017    source источник
comment
Не очень разбираюсь в этом, но похоже, что browser.newPage () терпит неудачу, попробуйте поймать и проверить исключение, даже звучит так, как будто страница имеет значение null (т.е. browser.newPage () либо не является обещанием, либо возвращает пустой?   -  person PiniH    schedule 24.09.2017
comment
@PiniH спасибо fr answer, не новые работы Я редактирую страницу, чтобы показать случай с более подробной информацией   -  person Vivien Pipo    schedule 24.09.2017


Ответы (1)


Просто проблема с областью видимости: ваша функция setSelectVal не имеет переменной страницы, обязательно передайте ее ей.

const puppeteer = require('puppeteer');

async function setSelectVal(page, sel, val) {
    return await page.evaluate((data) => {
        return document.querySelector(data.sel).value = data.val
    }, {sel, val})
}

(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('url',  {waitUntil: 'load'});
  await setSelectVal(page, 'select[name=targetname]', 5)
})();
person PiniH    schedule 24.09.2017
comment
к сожалению, я пробовал это раньше, и это вызывает другую ошибку, я отредактировал вопрос, чтобы отобразить ошибку - person Vivien Pipo; 24.09.2017
comment
Попробуйте дождаться setSelectVal - person PiniH; 24.09.2017
comment
теперь ошибка: (узел: 16312) UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 1): ошибка: ошибка протокола (Runtime.evaluate): цель закрыта. (узел: 16312) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода. - person Vivien Pipo; 24.09.2017
comment
Также ждите page.evaluate, что (я думаю) происходит, потому что вы не ждете, что все закрывается, поскольку он думает, что ему не нужно ничего делать - person PiniH; 24.09.2017