📚

Puppeteer備忘録(Nuxt.js, ElementUI対応?)

2022/01/20に公開

環境

  • Nuxt.js 2.15
  • puppeteer 13.1.1

書かないこと

  • 環境構築方法
  • Circle CIでE2Eテストを実行する方法

テンプレート

下記コードに書き込む想定です

const puppeteer = require('puppeteer')
let browser
let page

describe('ほげほげ', () => {
  beforeAll(async () => {
    browser = await puppeteer.launch({
      args: ['--window-size=1920,1080']
    })
    page = await browser.newPage()
  })

  afterAll(async () => {
    await browser.close()
  })

  it('ここに書く', async () => {
    /////////////
  })
})

故障かな?と思ったら デバッグ方法

`await page.screenshot({ path: 'sample.png' })が便利です。スクショが保存されます。gitに変なの載せないように気をつけてね

ページ遷移

await page.goto('http://localhost:8080')

nuxt.config.jsなどでauthしてないとsignInページなどに飛ばす設定をしている場合


// リダイレクト処理が走っているので最後のネットワーク通信が終わってから500ms待ちます
await page.goto('http://localhost:8080', {
  waitUntil: 'networkidle2'
})

// サインインページにリダイレクトしています
expect(page.url()).toBe('http://localhost:8080/signIn')

または

await page.goto('http://localhost:8080')

// ネットワーク通信に関わらず、ページ遷移を待ちます
await page.waitForNavigation()

expect(page.url()).toBe('http://localhost:8080/signIn')

操作系

ElementUIのel-buttonは、普通にclickができなかったので、フォーカスしてEnterを押すというゴリ押しをした

// ボタンにフォーカス
await page.focus('ELEMENT')
// Enterを押下
await page.keyboard.press('Enter')

動的に生成する要素で出るタイミングが掴めないときはセレクタを待つというのも手

await page.waitForSelector('#hoge')
// 入力
await page.type('#hoge', 'foo')

取得した要素の中身などを正規表現で抽出し、次以降のテストに利用したりした

const content = await page.evaluate(function() {
  return document.getElementById('.includeUrlArea').value
})

// 正規表現でURLを抽出
const re = `https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+`
const url = content.match(re)[0]

wait系まとめ

waitForTimeout

指定したミリ秒待つ

waitForSelector

指定したセレクタが現れるまで待つ

waitUntil

page.gotoなどの第二引数のオブジェクトに入れる。種類は以下

文字列 内容
load ローディングが終わった時
domcontentloaded DOMContentLoadedが終わったとき
networkidle0 500ms待ってネットワーク通信が発生していないとき
networkidle2 500ms待ってネットワーク通信が2つ以上発生していないとき

参考リンク

Discussion