【JavaScript】Playwrightのevaluateはクロージャ諸々使えない

こんにちは、フリーランスエンジニアの太田雅昭です。

Playwright

PlaywrightはChromiumを使えるJavaScriptライブラリです。

evaluate

ブラウザ内でJavaScriptを実行する場合に、evaluateを使用します。

const href = await page.evaluate(() => document.location.href);

公式サイトによれば、asyncも使えるようです。

const status = await page.evaluate(async () => {
  const response = await fetch(location.href);
  return response.status;
});

中でconsole.logを使っても、外には反映されません。

const href = await page.evaluate(() => console.log('abc'));

また、クロージャは動きません。悲しい。

const data = 'some data';
const result = await page.evaluate(() => {
  // WRONG: there is no "data" in the web page.
  window.myApp.use(data);
});

データを中に渡すには、以下のようにします。

const data = 'some data';
// Pass |data| as a parameter.
const result = await page.evaluate(data => {
  window.myApp.use(data);
}, data);

外に色々なデータを出したいときは、構造体を使うとよさそうです。

const result = await page.evaluate(() => {
  return {
    data: 'aaa',
    logs: ['log1', 'log2'],
  }
});