Puppeteer: рд╣реЗрдбрд▓реЗрд╕ рд╣реЗрдбрдлреБрд▓ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреАрдмреА рдХреЛ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдирд╡ре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: puppeteer/puppeteer

  • рдХрдардкреБрддрд▓реА рд╕рдВрд╕реНрдХрд░рдг: v0.13.0-alpha https://github.com/GoogleChrome/puppeteer/pull/1259 рдХреЗ рд╕рд╛рде
  • рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо / рдУрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг: рд╡рд┐рдВрдбреЛрдЬ 7 x64
  • рдпреВрдЖрд░рдПрд▓ (рдЕрдЧрд░ рд▓рд╛рдЧреВ рд╣реЛ): https://example.org/

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдХреГрдкрдпрд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВред


рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    let browser = await puppeteer.launch({
      headless: false,
      userDataDir: 'test-profile-dir',
    });
    let page = await browser.newPage();
    await page.goto('https://example.org/');
    await page.evaluate(setIDB, 'headfulIDB', 'foo');
    await page.close();
    await browser.close();

    browser = await puppeteer.launch({
      headless: true,
      userDataDir: 'test-profile-dir',
    });
    page = await browser.newPage();
    await page.goto('https://example.org/');
    await page.evaluate(setIDB, 'headlessIDB', 'bar');
    await page.close();
    await browser.close();

    browser = await puppeteer.launch({
      headless: false,
      userDataDir: 'test-profile-dir',
    });
    page = await browser.newPage();
    await page.goto('https://example.org/');
    console.log('Headful mode.');
    console.log('Headful IDB: ', await page.evaluate(getIDB, 'headfulIDB'));
    console.log('Headless IDB: ', await page.evaluate(getIDB, 'headlessIDB'));
    await page.close();
    await browser.close();

    browser = await puppeteer.launch({
      headless: true,
      userDataDir: 'test-profile-dir',
    });
    page = await browser.newPage();
    await page.goto('https://example.org/');
    console.log('Headless mode.');
    console.log('Headful IDB: ', await page.evaluate(getIDB, 'headfulIDB'));
    console.log('Headless IDB: ', await page.evaluate(getIDB, 'headlessIDB'));
    await page.close();
    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();


function setIDB(key, value) {
  return new Promise((resolve, reject) => {
    const openRequest = indexedDB.open('testIDB', 1);

    openRequest.onerror = (err) => { reject(err.target.error); };
    openRequest.onupgradeneeded = (event) => { event.target.result.createObjectStore('test'); };

    openRequest.onsuccess = (event) => {
      const db = event.target.result;

      db.onerror = (err) => { db.close(); reject(err.target.error); };

      db.transaction('test', 'readwrite')
        .objectStore('test')
        .put(value, key)
        .onsuccess = () => { db.close(); resolve(); };
    };
  });
}

function getIDB(key) {
  return new Promise((resolve, reject) => {
    const openRequest = indexedDB.open('testIDB', 1);

    openRequest.onerror = (err) => { reject(err.target.error); };
    openRequest.onupgradeneeded = (event) => { event.target.result.createObjectStore('test'); };

    openRequest.onsuccess = (event) => {
      const db = event.target.result;

      db.onerror = (err) => { db.close(); reject(err.target.error); };

      db.transaction('test', 'readonly')
        .objectStore('test')
        .get(key)
        .onsuccess = (eventGet) => {
          const { result } = eventGet.target;
          db.close();
          resolve(result);
        };
    };
  });
}



рдЖрдЙрдЯрдкреБрдЯ:

Headful mode.
Headful IDB:  foo
Headless IDB:  undefined
Headless mode.
Headful IDB:  undefined
Headless IDB:  bar


рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рддрд░рд╣ рдЧрдВрдз рдЖрддреА рд╣реИ), рдпрд╣ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ --user-data-dir=/tmp/someFolder/ ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕рдб рдбреАрдмреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдмрдВрдж рдХрд░реЗрдВ, рдлрд┐рд░ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣реЗ (рдЗрд╕рд▓рд┐рдП рд╣реЗрдбрдлреБрд▓ рд╣реЗрдбрдлреБрд▓ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛)ред рдЬреЛрдбрд╝реА рдХреЗ рдЕрдиреНрдп рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмреАрдЪ рднреА рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ: рд╣реЗрдбрд▓реЗрд╕ - рд╣реЗрдбрд▓реЗрд╕, рдФрд░ рд╣реЗрдбрд▓реЗрд╕ - рд╣реЗрдбрдлреБрд▓, рд╣реЗрдбрдлреБрд▓ - рд╣реЗрдбрд▓реЗрд╕ред

рдпрд╣ рдХрдардкреБрддрд▓реА рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рддрд░рд╣ рдЧрдВрдз рдЖрддреА рд╣реИ), рдпрд╣ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ --user-data-dir=/tmp/someFolder/ ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕рдб рдбреАрдмреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдмрдВрдж рдХрд░реЗрдВ, рдлрд┐рд░ рд╣реЗрдбрдлреБрд▓ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣реЗ (рдЗрд╕рд▓рд┐рдП рд╣реЗрдбрдлреБрд▓ рд╣реЗрдбрдлреБрд▓ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛)ред рдЬреЛрдбрд╝реА рдХреЗ рдЕрдиреНрдп рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмреАрдЪ рднреА рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ: рд╣реЗрдбрд▓реЗрд╕ - рд╣реЗрдбрд▓реЗрд╕, рдФрд░ рд╣реЗрдбрд▓реЗрд╕ - рд╣реЗрдбрдлреБрд▓, рд╣реЗрдбрдлреБрд▓ - рд╣реЗрдбрд▓реЗрд╕ред

рдпрд╣ рдХрдардкреБрддрд▓реА рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдирдорд╕реНрддреЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ ' about:blank ' рдкреГрд╖реНрда рдкрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕