【Node】外部との連携
kurumin
プログラミングのーと
下記コマンドでplaywrightをインストール。
npx init playwright下記ソースでHTMLを取得する。
import { chromium } from "@playwright/test";
(async () => {
// @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch
// ブラウザのタブ
const browser = await chromium.launch({ headless: false, slowMo: 500 });
// ページ
const page = await browser.newPage();
await page.goto("http://localhost:3000");
// HTML取得
const htmlStr = await page.content();
console.log(htmlStr);
await browser.close();
})();awaitは非同期処理(promiseを返す関数・順番を待たないで次の処理が実行される関数)に付けて、処理が終わるまで待機させる。
オブジェクトのprototypeの中身を確認し、asyncが先頭についている関数はawaitを付けると覚えたらOK。
import { chromium } from "@playwright/test";
(async () => {
// @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch
const browser = await chromium.launch({ headless: false, slowMo: 500 });
const page = await browser.newPage();
await page.goto('http://localhost:3000');
// CSSセレクタで要素を取得
const pageTitleLocaor = await page.locator('.navbar-brand');
const pageTitle = await pageTitleLocaor.innerText();
console.log(pageTitle);
await browser.close();
})();
const textLocaor = await page.locator('text=名刺管理アプリ');
const PageText = await textLocaor.innerText();
console.log(PageText);const xpathLocaor = await page.locator(`xpath=//*[@id="__next"]/nav/div/a`);
const xpathText = await textLocaor.innerText();
console.log(xpathText);xpath=: XPathセレクタを指定することを示す接頭辞。//: ドキュメント内のどの階層でもマッチすることを示します。[@id="__next"]: id 属性が "__next" という値を持つ要素を指定します。この部分は要素を特定するための属性条件です。/nav: id 属性が "__next" の要素の中にある nav 要素を指定します。この部分は階層内の要素を特定するための要素名です。/div/a: nav 要素の中にある div 要素の中にある a 要素を指定します。これにより、指定された条件の要素が特定されます。HTMLドキュメント内の id 属性が "__next" の要素の下にある nav 要素内の div 要素の下にある a 要素 という意味になる。
開発ツールから要素を選択しコピー→xpathで簡単に取得することもできる。
const pageItemLocaor = await page.locator('.cards.list-group-item > a >> nth=2');
const pageItem = await pageItemLocaor.innerText();
console.log(pageItem);同じ要素が並んでるときに、何番目を取得するかを指定する。
0からスタートするので、2にした場合は3番目の要素が取得されることになる。
nth=-1とすると、最後の要素を取得できる。
.cards.list-group-item:nth-child(3) > a の書き方も可能。
const pageItemLocaor = await page.locator('.cards.list-group-item >> ..');
const pageItem = await pageItemLocaor.innerText();
console.log(pageItem);.cards.list-group-itemの親要素という意味になる。
const cardLocator = page.locator('.cards.list-group-item');
const cardCount = await cardLocator.count();
console.log(cardCount);下記のソースで、input要素に文字入力を行える。
import { chromium } from "@playwright/test";
(async () => {
// @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch
const browser = await chromium.launch({ headless: false, slowMo: 500 });
const page = await browser.newPage();
await page.goto('http://localhost:3000');
await page.waitForTimeout(2000);
// input要素に文字列を入力
const inputLocator = page.locator(`xpath=//*[@id="__next"]/div/div[1]/label/input`);
await inputLocator.type('美穂');
await browser.close();
})();ページャーを取得し、クリックする。
const pager3Locator = page.locator('.page-link.page-number >> nth=2');
await pager3Locator.click();