如何在 puppeteer 中导航 dom 个元素?

How do I navigate dom elements in puppeteer?

背景

我们第一次使用 puppeteer 编写一些自动化的端到端测试。我们一直在深入挖掘他们的 API,但我们对系统的基本用途感到困惑和挣扎。

真正的问题

puppeteer 希望我们如何与元素互动?

评论

我真正想要的是针对我们各种用途的更加精简的 API 文档,或者更好的是,一个非常流畅的教程。我们已经看了很多,但我们还没有得到这类答案。

我们发现的所有指南都在做,但我们不想做的是手动将大量 ID 和选择器放入代码中。我明白为什么,但出于我们的目的,我们想要读取页面上的内容并根据它的形状生成我们的行为。

感谢您的宝贵时间!

额外学分

我应该如何处理这些代码片段?什么methods/structures?

这里有一个想要在所有文本输入中键入一个字符串,但获取所有输入的值。

const nodeList = await page.$$('input');
const result = nodeList.map(async node => {
    if(node.type === 'text'){
        await node.type('2018');
    }
    return await node.getAttribute('value')
})
return result

这是一个想要将跨度标签键入该跨度的父项中的任何子输入的人 div。

const nodeList = await page.$$('span');
const result = nodeList.map(async node => {
    const parentDiv = node.NearestAncestor('div')
    const inputs = parentDiv.$$('input')
    **Use Code From Above**
})
return result

您可以尝试将您的承诺包装在 Promise.all.

因此,不是 returning result,而是 return Promise.all(result),一旦它获得所有数据,它就会解析。

此外,有许多不同的方法可以浏览列表或选择器。

$$评估

这会在页面内运行 Array.from(document.querySelectorAll(selector)) 并将其作为第一个参数传递给 pageFunction。

示例代码:

await page.$$eval('a', a => a.href)

评估

这是黄金,您可以执行您可以在浏览器控制台上执行的任何代码。

const result = await page.evaluate(() =>
  [...document.querySelectorAll('input')] // or anything that you want to use normally
)

有用的 API

有几个有用的 API 可以明智地使用:

  • .type: 在选择器上键入文本
  • .click:点击elementhandle/selector等
  • .select: 从元素中选择一些东西

知道什么行不通

elementHandle.attribute() 已在 #638 上删除。这意味着从现在起应该由 $eval 处理获取属性。