セレクターをクリックできますが、質問はドロップダウンリストからオプションの1つを選択する方法ですか?
await page.click('#telCountryInput > option:nth-child(4)')
CSSセレクターを使用するオプションをクリックしても機能しません。
たとえば、以下のようなリストから国コードを選択し、
Puppeteer v0.13.0には page.select() メソッドがあり、まさにそれを行います。選択する値を指定するだけです。したがって、<option value="my-value">
に<select>
があると仮定します。
await page.select('#telCountryInput', 'my-value')
ドロップダウンコンポーネントについては、2つの状況を考慮する必要があると思います。
select
要素2番目の状況では、click
が問題を解決できると思います。
最初の状況では、これを行う2つの方法を見つけました。
page.select
elementHandle.type
(2018年4月27日に更新された通知)page.select
は、v0.12.0で追加された新機能です。
たとえば、select要素があります:
<label>Choose One:
<select name="choose1">
<option value="val1">Value 1</option>
<option value="val2">Value 2</option>
<option value="val3">Value 3</option>
</select>
</label>
2番目のオプション「値2」を選択するには2つの方法があります。
// use page.select
await page.select('select[name="choose1"]', 'val2');
// use elementHandle.type
const selectElem = await page.$('select[name="choose1"]');
await selectElem.type('Value 2');
通常、elementHandle.type
は入力テキストボックスにテキストを入力するために使用されますが、
要素にフォーカスを設定し、テキスト内の各文字に対してキーダウン、キー押下/入力、およびキーアップイベントを送信します。
select
HTML要素には入力イベントがあるため、このメソッドは機能します。
そして、個人的にはelementHandle.type
の方が優れていると思います。なぜなら、オプション値の属性を知る必要はなく、ラベル/名前だけを見ることができるからです。
以前にMac OSXでのみelementHandle.type
を使用しました。最近、私の同僚がこれに関連するバグを報告しました。彼はLinux/Winを使用しています。また、私たちは両方ともpuppeteer v1.3.0を使用しています。
試行錯誤の後、このelementHandle.type
が<select>
要素に値を割り当てることができることがわかりましたが、これは要素のchange
イベントをトリガーしません。
だから、elementHandle.type
で<select>
を使用することはお勧めしません。
最後に、 このコメント に従って、変更イベントを手動でディスパッチしました。次のようなものです。
// use manually trigger change event
await page.evaluate((optionElem, selectElem) => {
optionElem.selected = true;
const event = new Event('change', {bubbles: true});
selectElem.dispatchEvent(event);
}, optionElem, selectElem);
ネイティブ選択ボックスの場合、私のソリューションはページ自体でいくつかのJSを実行することでした:
await page.evaluate(() => {
document.querySelector('select option:nth-child(2)').selected = true;
})
ドロップダウンリストはネイティブのHTML selctionoptionの組み合わせではないため、これは思ったより簡単です。したがって、実際に以下のコードを使用して目的のターゲットを選択できます。
await page.click('#telCountryInput')
await page.click('#select2-telCountryInput-results > li:nth-child(4)')