javascript - Puppeteer使用JS路径选择器通过DOM输入登录文本的问题

标签 javascript node.js dom screen-scraping puppeteer

我正在尝试让 Puppeteer 登录到各种站点。

在一个站点上,以下代码可以正常工作:

const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://www.site1.com');
await page.waitFor('input[name=UserID]');
await page.$eval('input[name=UserID]', el => el.value = 'myusername1');

这在其他网站上不起作用。用户名是一个名为 id="username" 的选择器。所以我运行了它 headless=false 并且它打开了登录页面,因此我得到了名为“username”的选择器的完整 JS 路径,即:

document.querySelector("body > banno-web > bannoweb-login").shadowRoot.querySelector("div > jha-card > article > bannoweb-login-form").shadowRoot.querySelector("#username")

我只是想输入用户名,但我不知道通过 DOM 获取用户名字段的语法。这不起作用:

await page.$eval('input[id=username]', el => el.value = 'myusername2');

最佳答案

使用page.evaluate

您可以使用page.evaluate在页面本身上运行 JavaScript。

代码示例

const result = await page.evaluate(() => {
  document.querySelector("body > banno-web > bannoweb-login")
  .shadowRoot.querySelector("div > jha-card > article > bannoweb-login-form")
  .shadowRoot.querySelector("#username")
  .value = 'myusername2';
});

使用elementHandle.type

但是,当输入字段的值发生这样的更改时,具有用于焦点、输入等的特殊事件处理程序的复杂应用程序(例如 Angular 页面)无法正常工作。为了表现得更像人类,我们应该使用像 elementHandle.type 这样的函数相反。

代码示例

const jsHandle = await page.evaluateHandle(
  () => document.querySelector("body > banno-web > bannoweb-login")
  .shadowRoot.querySelector("div > jha-card > article > bannoweb-login-form")
  .shadowRoot.querySelector("#username")
);
const elementHandle = await jsHandle.asElement();
await elementHandle.type('myusername2');

此代码使用 page.evaluateHandlejsHandle.asElement 从 JavaScript 选择器获取 ElementHandle。之后,使用 elementHandle.type 填充文本。

关于javascript - Puppeteer使用JS路径选择器通过DOM输入登录文本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57740408/

相关文章:

javascript - 在 javascript 中使用数组从 JSON 获取元素

javascript - 从文本加载javascript中的html文档

javascript - HTML 中是否允许 <head> 和 <body> 之外的 &lt;script&gt; 标记?

node.js - 在 Nodejs 中导出的自定义模块中使用函数时出现问题

node.js - haxe node js 拆分js,而不是一个js

javascript - HTML JS 文本编辑器

javascript - 如何使用 JQuery 切换功能在单击时显示/隐藏 DIV?

javascript - getElementById(...) 为 null - 具有 2 个变量的函数

javascript - 对对象数组内的对象数组运行 `every` 方法

javascript - 如何在同构应用程序中通过 Node 获取传递请求 cookie?