【问题标题】:How to accept a JavaScript alert popup in Puppeteer?如何在 Puppeteer 中接受 JavaScript 警报弹出窗口?
【发布时间】:2019-05-23 03:36:39
【问题描述】:

我有一个使用 Puppeteer 自动登录公司门户的脚本。登录使用 SAML。因此,当 puppeteer 打开一个 chromium 实例并访问该页面时,屏幕上会出现一个弹出窗口以确认用户的身份。我需要做的就是手动单击“确定”按钮或从键盘按 Enter。

我曾尝试使用 puppeteer 模拟按下 Enter 键,但它不起作用。

登录屏幕 -

脚本 -

const puppeteer = require('puppeteer');


async function startDb() {
    const browser = await puppeteer.launch({
        headless:false,
        defaultViewport:null
    });
    const page = await browser.newPage();
    await page.goto("https://example.com");
    await page.waitFor(3000);
    await page.keyboard.press('Enter');
    console.log('Opened')
};


startDb(); 

**编辑**

【问题讨论】:

    标签: javascript node.js automation puppeteer


    【解决方案1】:

    this issue中提出了一个解决方案:

    基本上只是拦截请求,然后使用您最喜欢的 httpclient 库自己触发请求,并使用响应信息响应拦截的请求。

    const puppeteer = require('puppeteer');
    const request = require('request');
    const fs = require('fs');
    
    (async () => {
        const browser = await puppeteer.launch();
        let page = await browser.newPage();
    
        // Enable Request Interception
        await page.setRequestInterception(true);
    
        // Client cert files
        const cert = fs.readFileSync('/path/to/cert.crt.pem');
        const key = fs.readFileSync('/path/to/cert.key.pem');
    
        page.on('request', interceptedRequest => {
            // Intercept Request, pull out request options, add in client cert
            const options = {
                uri: interceptedRequest.url(),
                method: interceptedRequest.method(),
                headers: interceptedRequest.headers(),
                body: interceptedRequest.postData(),
                cert: cert,
                key: key
            };
    
            // Fire off the request manually (example is using using 'request' lib)
            request(options, function(err, resp, body) {
                // Abort interceptedRequest on error
                if (err) {
                    console.error(`Unable to call ${options.uri}`, err);
                    return interceptedRequest.abort('connectionrefused');
                }
    
                // Return retrieved response to interceptedRequest
                interceptedRequest.respond({
                    status: resp.statusCode,
                    contentType: resp.headers['content-type'],
                    headers: resp.headers,
                    body: body
                });
            });
    
        });
    
        await page.goto('https://client.badssl.com/');
        await browser.close();
    })();
    

    【讨论】:

    • 我们如何获得证书和密钥?我试图从浏览器中导出证书。但我找不到 .pem 类型的导出文件选项。检查编辑
    • 请看看这个答案和评论是否有帮助:superuser.com/a/1292098/333511
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多