te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - How to load script in puppeteer? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to load script in puppeteer? - Stack Overflow

programmeradmin3浏览0评论

I'm trying to load axios in chromium using puppeteer, the code is as follows:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false})
  const page = await browser.newPage()
  await page.goto('')
  await page.evaluate(async () => {
    var script = document.createElement('script');
    script.setAttribute('src','/[email protected]/dist/axios.min.js');
    document.head.appendChild(script);
    var r = await axios.get('')
    console.log(r)
  })
})()

But when I try to execute axios.get it returns Evaluation failed: ReferenceError: axios is not defined. What's the issue here?

I'm trying to load axios in chromium using puppeteer, the code is as follows:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false})
  const page = await browser.newPage()
  await page.goto('https://httpbin/get')
  await page.evaluate(async () => {
    var script = document.createElement('script');
    script.setAttribute('src','https://unpkg./[email protected]/dist/axios.min.js');
    document.head.appendChild(script);
    var r = await axios.get('https://httpbin/get')
    console.log(r)
  })
})()

But when I try to execute axios.get it returns Evaluation failed: ReferenceError: axios is not defined. What's the issue here?

Share Improve this question asked Dec 16, 2020 at 22:31 nazekami59nazekami59 4202 gold badges8 silver badges13 bronze badges 0
Add a ment  | 

3 Answers 3

Reset to default 8

Use page.addScriptTag for this:

await page.goto('https://example.');

await page.addScriptTag({ url: 'https://unpkg./[email protected]/dist/axios.min.js' }); 

const data = await page.evaluate(async () => {
  const response = await axios.get('https://httpbin/get')
  return response.data; // <-- this is important: the whole response cannot be returned
});

In my case, I was trying to load a local script before loading a local HTML template.

I did not want to embed the script code into the HTML template since the HTML template was already too big.

The following code and the local js file with the script code (scriptCode.js) were in the same directory (hence the use of __dirname):

const path = require("path");
// ...
const page = await browser.newPage();
await page.addScriptTag({path: path.join(__dirname, 'scriptCode.js')})
await page.setContent(html);

If you have axios in a local folder, you have to point to the path where you've downloaded it.

But if you still want to download it off its CDN every time, instead of using the path option, the answer provided by Vaviloff is the perfect one.

Documentation:

  • Page.addScriptTag
  • FrameAddScriptTagOptions interface

page.addScriptTag is useful in the mon case, but if you have reason to do this manually in the browser context as OP is attempting, the missing piece is setting a script.onload function to only run code from the script (like axios.get) after it's loaded.

If you want to return data from the onload function back to Node, then you can use a promise as follows:

const puppeteer = require("puppeteer"); // ^23.6.0

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const result = await page.evaluate(async () => {
    const script = document.createElement("script");
    const result = new Promise(resolve =>
      script.onload = () => 
        resolve(axios.get("https://httpbin/get"))
    );
    const url = "https://unpkg./[email protected]/dist/axios.min.js";
    script.setAttribute("src", url);
    document.head.appendChild(script);
    return (await result).data;
  });
  console.log(result);
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());
发布评论

评论列表(0)

  1. 暂无评论