处理页面弹框
弹框主要分为三种类型:alertbox、confirmbox、promptbox。alterbox主要用于给用户显示一些提示信息,通常会带一个OK按钮,点击OK按钮即可关闭alterbox。confirmbox主要让用户输入确认或者取消信息,confirmbox通常会带OK和CANCEL按钮,点击OK或者CANCEL都可以关闭confirmbox。promptbox主要让用户输入一些信息,通常会带一个text输入框和OK、CANCEL按钮,点击OK或者CANCEL都可以关闭promptbox。
如下图所示,当点击页面的populate按钮时,页面弹出了alertbox。
顽固派 弹出页
此时 如果不关闭上面的弹框,页面上其他element都不可点击。对于这类弹框,处理的机制是实时监听页面上是否显示了弹框,如果有即可关闭,防止其影响正常的自动化脚本运行。那么使用puppeteer框架时如何处理弹框呢?请看下面的案例。
const puppeteer = require('puppeteer');
(async () => {
const args = [
'--no-sandbox', // 沙盒模式
'--disable-setuid-sandbox', // uid沙盒
'--disable-infobars',
'--window-position=0,0',
'--ignore-certifcate-errors',
'--ignore-certifcate-errors-spki-list',
'--user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3312.0 Safari/537.36"',
'--disable-gpu', // GPU硬件加速
'--disable-dev-shm-usage', // 创建临时文件共享内存
'--no-first-run', // 没有设置首页。在启动的时候,就会打开一个空白页面。
'--no-zygote',
'--single-process' // 单进程运行
];
const options = {
args,
headless: false,
ignoreHTTPSErrors: true,
slowMo: 250,
defaultViewport: { width: 1920, height: 1080 }
};
const browser = await puppeteer.launch(options);
const browserWSEndpoint = browser.wsEndpoint();
const page = await browser.newPage();
await page.on('dialog', async dialog => {
await page.waitForTimeout(2000);//延时2s后自动关闭弹窗
switch (dialog.type()) {
case 'alert':
await dialog.dismiss();
break;
case 'confirm':
await dialog.accept();
break;
case 'prompt':
await dialog.accept("type things");
break;
default :
throw "can't get dialog type"
}
//自动化脚本最前面通过page.on()添加对页面的监听操作,如果出现弹框,调用dialog.dismiss()方法关闭弹框
//dialog.dismiss()相当于点击弹框右上角的关闭按钮
//dialog.accept()相当于点击弹框的OK按钮,如果是prompt类型的弹框,调用dialog.accept('conent')模拟在prompt弹框中输入conent
//dialog.type()返回监听到的dialog类型,类型包含:alert,confirm,prompt和beforeunload
});
await page.goto('https://www.zhihu.com/question/302349728/answer/531536034');
//对于无法监听到的顽固弹窗。当然我们也可以简单粗暴的使用点击事件来干掉 page.click('.Button>.Zi--Close');
//await page.click('.Button>.Zi--Close')
//await page.click('#populate')
//await page.click('input[name="alert"]')
await page.waitForTimeout(2000);//延时2s后自动关闭弹窗
// 此时为了防止 element is not defined 错误我们应该监听此页面元素是否弹出
const searchPopout = await page.$(".Button>.Zi--Close");
if (searchPopout) await page.click('.Button>.Zi--Close');
// page.close();
// browser.close();
})();
await page.on('dialog', async dialog => {
await page.waitForTimeout(2000);//延时2s后自动关闭弹窗
switch (dialog.type()) {
case 'alert':
await dialog.dismiss();
break;
case 'confirm':
await dialog.accept();
break;
case 'prompt':
await dialog.accept("type things");
break;
default :
throw "can't get dialog type"
}
//自动化脚本最前面通过page.on()添加对页面的监听操作,如果出现弹框,调用dialog.dismiss()方法关闭弹框
//dialog.dismiss()相当于点击弹框右上角的关闭按钮
//dialog.accept()相当于点击弹框的OK按钮,如果是prompt类型的弹框,调用dialog.accept('conent')模拟在prompt弹框中输入conent
//dialog.type()返回监听到的dialog类型,类型包含:alert,confirm,prompt和beforeunload
});