javascript - Puppeteer:登录对话框上的访问字段
问题描述
我正在尝试使用 Node.js 通过 Puppeteer / Headless Chrome 从我们的 Intranet 中的页面生成 .pdf。
从随机页面生成 .pdf 没有问题,但我正在努力处理打开页面时出现的登录框架。
它看起来像这样:
我找不到访问“Nutzername”和“Passwort”这两个字段以登录的方法,因为 Chrome 的开发人员工具不显示字段名称。
打开此页面时生成的 .pdf 文件或屏幕截图始终显示“未经授权”,就好像 Headless Chrome 在此对话框中按下了 Abbrechen(中止)一样。
到目前为止我尝试的是这样的:
const puppeteer = require('puppeteer');
(async () => {
let url = 'http://intranet...../'
let browser = await puppeteer.launch()
let page = await browser.newPage()
await page.goto(url, {waitUntil: 'networkidle2' })
await page.type('#Nutzername', '....'); // Error here, because the identifier is wrong.
await page.keyboard.press("Tab");
await page.type('#Passwort', '....');
await page.type(String.fromCharCode(13)); // Enter
await page.pdf({
format:"A4",
path:'./Speiseplan.pdf',
displayHeaderFooter: false,
printBackground:true
})
process.exit()
})();
不能将 Puppeteer 与那种登录对话框一起使用吗?
解决方案
Chrome 中的开发人员工具将无法挂钩这些字段,因为它们不是 DOM 的一部分;当服务器指示需要通过HTTP 基本身份验证进行身份验证时,它们是由 Chromium 本身本地生成的字段。
幸运的是,puppeteer
它位于 DOM 和它生成的 Chromium 实例的本机层之上,并公开了page.authenticate()
用于处理此类情况的方法。在导航到要求基本身份验证凭据的页面之前调用page.authenticate()
以设置要使用的用户名/密码对:
const puppeteer = require('puppeteer');
(async () => {
let url = 'http://intranet...../'
let browser = await puppeteer.launch()
let page = await browser.newPage()
await page.authenticate({'username':'YOUR_BASIC_AUTH_USERNAME', 'password': 'YOUR_BASIC_AUTH_PASSWORD'});
await page.goto(url, {waitUntil: 'networkidle2' })
await page.pdf({
format:"A4",
path:'./Speiseplan.pdf',
displayHeaderFooter: false,
printBackground:true
})
process.exit()
})();
DEV.to 上的 Sony AK有一篇简短而有趣的文章,其中包含示例代码,说明了page.authenticate()
的用法。
推荐阅读
- android - 使用自定义适配器在视图中仅显示列表的某些元素
- macos - 如何授予对 Mac 上文件和文件夹的网页访问权限
- php - Magento 2 将扩展属性添加到 Magento\Sales\Api\Data\ShipmentTrackInterface
- javascript - 有没有一种方法可以在不使用 setInterval 的情况下动态绑定字符串及其输出的文本?
- python - Findall 跨多个数据框列
- python - Django:使用多个模式进行测试的设置
- php - 使用 PHP 在单个实例中选择所有表单字段
- reactjs - 无法连接到 Firestore 数据库
- amazon-web-services - 读取 HDFS 上的特定块
- python-3.x - 请问我该如何解决错误hep!!!!它在 err 参数中给出了无效的语法错误