headless false - 始终关注地址栏

headless false - focus always on address bar

我正在使用带有 headless=false 选项的 puppeteer,以便让用户在表单中键入一些详细信息,然后以编程方式读取结果。 我希望 cursor/focus 在页面加载时出现在第一个输入字段上,但焦点始终在地址栏上。 有没有办法将 cursor/focus 移动到页面内?

我已经试过了await page.focus(selector)。 请找到以下示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: false});
  const page = await browser.newPage();
  let selector = ".w3-white.w3-padding.notranslate>form>input[name='firstname']";
  await page.goto('https://www.w3schools.com/html/html_forms.asp');
  await page.waitForSelector(selector,{waitUntil :"networkidle2"});
  await page.focus(selector);
  await page.type(selector,"aaa");

  //await browser.close();
})();

我希望在页面加载后,用户将能够在输入字段中键入内容,而不必先 "move" 进入该字段(通过鼠标或 Tab)。

有一点需要更正,waitUntilpage.goto的一个选项:

await page.goto('https://www.w3schools.com/html/html_forms.asp',{waitUntil :"networkidle2"});

有了这个,您的示例就可以在 puppeteer 1.11 和节点 8.6 上正常工作

您遇到的问题是您将光标设置在页面内部,但浏览器本身的焦点仍在地址栏上。

要使浏览器聚焦页面本身,您需要调用 page.bringToFront(),这会将浏览器的焦点设置到选项卡。您应该在创建页面后立即执行此操作:

const page = await browser.newPage();
await page.bringToFront();

此外,正如其他答案中已经指出的那样,您为 page.waitForSelector 函数提供了无效选项。这只是被 puppeteer 忽略了(与你的问题无关),但应该被删除。

我调用了 mouse.click() 函数将我的光标从地址栏移动到页面。

await page.mouse.click(0, 0);

browser.newPage() 的使用方式如我所料,但这种情况会占用更多内存。所以我使用 click() 函数。