Locator 与交互
基于 Puppeteer v25.x 编写
速查
- Locator API(v20+ 推荐):
page.locator(sel),自动等待元素可见/enabled/位置稳定 - 交互:
locator.click()/fill(v)/hover()/scroll()/wait() - 函数 locator:
page.locator(() => 条件)等待任意条件 - 过滤/超时:
.filter(fn)/.setTimeout(ms) - 低层等待:
page.waitForSelector/waitForFunction(需手动管理 ElementHandle)
Locator API(自动等待)
Locator 是 v20 引入的现代 API,操作前自动等待前置条件:元素在视口内、可见、enabled、位置稳定(连续两帧不动)。优先用它,免手写等待:
js
await page.locator("input[name='email']").fill("user@example.com");
await page.locator("button[type='submit']").click();
await page.locator(".dashboard-title").wait(); // 等待可见交互
js
await page.locator("#btn").click();
await page.locator("input").fill("文本"); // 自动清空再输入
await page.locator("nav").hover();
await page.locator(".content").scroll({ scrollTop: 300 });函数 locator + 过滤 + 超时
js
// 函数 locator:等待任意自定义条件
const ids = await page
.locator(() => {
const els = document.querySelectorAll(".product-card");
if (els.length > 0) return [...els].map((el) => el.dataset.id);
})
.wait();
// 过滤 + 自定义超时
await page
.locator("li")
.filter((el) => el.textContent.includes("目标"))
.click();
await page.locator(".slow").setTimeout(10000).click();低层等待
Locator 之前的低层 API(需手动管理 ElementHandle 生命周期):
js
// 等元素出现(返回 ElementHandle,用完 dispose)
await page.waitForSelector(".result", { visible: true, timeout: 5000 });
// 等自定义条件(页面上下文轮询)
await page.waitForFunction(
() => document.querySelectorAll(".item").length >= 10,
);Locator 自动管理元素生命周期、内置重试,比
waitForSelector+ElementHandle更安全,应优先使用。