2

使用 puppeteer chrome 测试开发工具,我想设置和使用外部函数

  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:未处理的承诺拒绝(拒绝 id:1):错误:协议错误(Runtime.evaluate):目标已关闭。(节点:16312)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

你知道我应该怎么做吗?

4

1 回答 1

1

只是范围问题:您的 setSelectVal 函数没有 page 变量,请确保将其传递给它。

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)
})();
于 2017-09-24T12:14:22.397 回答