我们第一次使用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
答案 0 :(得分:3)
您可以尝试将您的承诺包装在Promise.all
中。
因此,您无需返回result
,而是返回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:
.type
:在选择器上键入文本.click
:单击元素句柄/选择器等.select
:从元素中选择内容 elementHandle.attribute()
已在#638上删除。这意味着获取属性应从$eval
开始处理。