代码之家  ›  专栏  ›  技术社区  ›  Pipo

木偶师:使用具有dom交互的外部函数

  •  2
  • Pipo  · 技术社区  · 9 年前

    有了Puppeter 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)未处理Promisejection警告:未处理的承诺 拒绝(拒绝id:1):错误:协议错误(运行时。评估): 不赞成拒绝承诺。未来,承诺拒绝 未处理的将终止节点。js流程 非零退出代码。

    你知道我该怎么做吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   PiniH    9 年前

    只是范围界定问题: 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)
    })();