javascript – 如何在puppeteer中导航dom元素?

背景

我们是第一次与puppeteer一起编写一些自动化的端到端测试.我们一直在深入挖掘他们的API,但是我们感到困惑并且难以理解我们对系统的基本用途.

真正的问题

木偶戏如何让我们与元素互动?

>获得他们的属性
>在他们身上设置东西
>找到他们的特定祖先和后代

评论

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

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

谢谢你的时间!

额外信用

我该如何实际处理这些代码片段?什么方法/结构?

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

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中的任何子输入中键入span标签的人.

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中.

因此,不是返回结果,而是返回Promise.all(result),一旦获得所有数据,它将解析.

此外,有许多不同的方式可以通过列表或选择器.

$$EVAL

这将在页面中运行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:单击元素句柄/选择器等
> .select:从元素中选择一些东西

知道什么是行不通的

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

上一篇:javascript – 在jest.setTimeout指定的5000ms超时内未调用异步回调


下一篇:javascript – Puppeteer JS从选择器生成PDF