簡體   English   中英

Puppeteer:如何根據文本選擇下拉選項?

[英]Puppeteer: How to select a dropdown option based on its text?

在 Puppeteer 中,我們可以通過提供值作為參數來選擇下拉選項:

page.select('select#idOfSelect', 'optionValue'); 

是否有根據文本而不是值來選擇選項的功能?

Puppeteer API 中沒有這樣的方法。 但是您可以使用 XPath option基於文本的選項,然后提取該元素的值並將該值傳遞給page.select() 這是一個完整的例子:

const puppeteer = require('puppeteer');

const html = `
        <html>
            <body>
                <select id="selectId">
                    <option value="volvo">Volvo</option>
                    <option value="saab">Saab</option>
                    <option value="mercedes">Mercedes</option>
                    <option value="audi">Audi</option>
                </select>
            </body>
        </html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`data:text/html,${html}`);

  const option = (await page.$x(
    '//*[@id = "selectId"]/option[text() = "Audi"]'
  ))[0];
  const value = await (await option.getProperty('value')).jsonValue();
  await page.select('#selectId', value);

  await page.screenshot({ path: 'screenshot.png' });
  await browser.close();
})();

您可以使用page.evaluate()通過其text屬性find您想要選擇的option 然后您可以使用selected屬性來指示當前選擇該選項:

await page.evaluate(() => {
  const example = document.querySelector('#example');
  const example_options = example.querySelectorAll('option');
  const selected_option = [...example_options].find(option => option.text === 'Hello, world!');

  selected_option.selected = true;
});

$$eval 可能比這些其他答案更干凈:

let optionValue = await page.$$eval('option', options => options.find(o => o.innerText === "foo")?.value)
await page.select('select#idOfSelect', optionValue);

您可以使用 page.evaluate() 並直接轉到您想要的元素。

await page.evaluate(() => {
    $("#idOfSelect option:contains('your-text')")[0].selected = true
})

盡管如果您的元素不存在,這將引發錯誤,因此您應該在選擇它之前確保該元素是否確實存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM