如何在操纵up的dom元素中导航?

时间:2018-06-22 17:54:35

标签: javascript testing dom automated-tests puppeteer

背景

我们第一次使用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内的任何子输入中键入跨度标签的人。

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

1 个答案:

答案 0 :(得分:3)

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

因此,您无需返回result,而是返回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开始处理。