Puppeteer
Dev #3
@kobashinG
Agenda
• Puppeteer 🤔
• Puppeteer 🐣
• Puppeteer E2E 🐌
• 👀

> 🙇
• E2E 🙊
Web
•
• Alexa
🙇🙇🙇
Puppeteer 🤔
Kotlin
https://youtu.be/lhZOFUY1weo
Puppeteer
Headless Chrome
Chrome
Devtools
Protocols
Headless Chrome
•
• Websocket port:9222
Headless Chrome
Chrome
Devtools
Protocols
CDP
• Devtools API
• Json
Puppeteer
Headless Chrome
Chrome
Devtools
Protocols
Puppeteer
• API
• Test
•
Puppeteer
Google I/O 2018 Puppeteer Session
I/O
• Keyboard & Touch & Mouse
• Page ScreenShot & PDF
• Create PDF
• Running Headless in the Cloud
• A/B Testing & Network interception
• SSR/Pre-Rendering
• Google Crower
Hack
A/B Testing & Network Interception
Cloud
BFF Backend,
… etc
Hack ?
A/B Testing & Network Interception
Cloud
BFF Backend,
… etc
Proxy-Server
SSR
A/B Testing
🐥 Puppeteer 🐣
$ npm i puppeteer
$ npm i puppeteer-core
Install
puppeteer Chromium
puppeteer-core
Screenshot
import * as puppeteer from 'puppeteer'
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
  await page.goto('https://yahoo.co.jp');
  await page.screenshot({
path: ‘out/yahoo.png’,
fullPage: true
});
await browser.close();
})();
Take a Screenshot
Select Dom & Screenshot
const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`https://twitter.com/xxxx`);
  const tweet = await page.$(
‘.tweet.permalink-tweet'
);
  await tweet.screenshot({
    path: 'out/tweet.png'
  });
  await browser.close();
Select Dom & Screenshot
📷 📸
Create a PDF
(async () => {
const browser = await puppeteer.launch();
const page1 = await browser.newPage();
  await page1.goto('https://yahoo.co.jp');
  await page1.pdf({path: 'out/yahoo.pdf'});
  await page1.close();
})();
Create a PDF
  const browser = await puppeteer.launch();
  const page2 = await browser.newPage();
  await page2.setContent(`
<!DOCTYPE html>
<html>
  <head>
    <style>…
HTML PDF
  `);
  await page2.pdf({path: 'out/sample.pdf'});
  await browser.close();
Create a PDF
Navigate Page
  const page = await browser.newPage();
  await page.goto(`https://twitter.com/xxxx`);
  await page.$eval(
    `.tweet[data-screen-name=“kobashinG"]`,
(tweet: HTMLElement) => tweet.click()
);
  await page.waitForSelector(
‘.tweet.permalink-tweet',
{visible: true}
);
Navigate Page
Keyboard Input
  await page.goto('https://google.com');
  await page.keyboard.type(' ');
  
  const [response] = await Promise.all([
  page.waitForNavigation(),
    // page.click('#srchbtn')
    page.keyboard.press('Enter')
  ]);
Keyboard Input
* Puppeteer with Jest 🎉
Puppeteer E2E 🐌
"jest": {
"preset": "jest-puppeteer",
Install & Configuration
TypeScript
$ npm i jest jest-puppeteer 
jest-image-snapshot 
ts-jest @types/jest
$ npm i jest jest-puppeteer 
jest-image-snapshot 
$ npm i ts-jest @types/jest 
@types/puppeteer 
@types/jest-environment-puppeteer 
@types/expect-puppeteer
Install
TypeScript
describe("Google", () => {
  beforeAll(async () => {
    await page.goto('https://google.com');
});
  it('should display "google" text on page’,
async () => {
     await expect(page).toMatch(‘google')
})
})
Hello World ,
describe("Google", () => {
  beforeAll(async () => {
    await page.goto('https://google.com');
});
  it('should display "google" text on page’,
async () => {
     await expect(page).toMatch(‘google')
})
})
E2E ,
Modern Frontend Test
🤩
🐥 🐣


• Puppeteer 🐌
• Headless Chrome 

🎉
🙇

Puppeteerのお話