处理页面弹框
弹框主要分为三种类型: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});
