首页 > 解决方案 > 为什么 puppeteer page.$$eval 返回 undefined

问题描述

我正在尝试使用 puppeteer 为我的 e2e 测试创建一个辅助函数,以从使用 Material UI 实现的选择下拉列表中选择一个项目。出于某种原因,下拉项返回未定义。这是我的功能。

export const selectFromDropDown = async (page, selectElement, className, value) => {
  const dropdownInput = await page.waitForSelector(selectElement)
  await dropdownInput.click()
  await page.waitForSelector(`li.${className}`)

  const dropdownItem = await page.$$eval(`li.${className}`, (listItems, val) => listItems.find((item) => item.dataset.value === val), value)
  console.log(dropdownItem, '000000')
  dropdownItem.click()
}

我也做过const dropdownItem = await page.$$eval(`li.${className}`, (listItems, val) => listItems.find((item) => console.log('match: ', item.dataset.value === val) || item.dataset.value === val), value)。它为其他人记录 false,为与该值匹配的列表项记录 true,但 dropdownItem 仍未定义。我究竟做错了什么?

标签: javascriptpuppeteer

解决方案


$$eval不会返回handle您需要使用evaluateHandle的 .

const dropdownItem = await page.evaluateHandle(
    (listItemsSelector, val) => 
        Array.from(document.querySelectorAll(listItemsSelector)
            .find((item) => item.dataset.value === val), 
    `li.${className}`, 
     value)
console.log(dropdownItem, '000000')
await dropdownItem.click()

推荐阅读