美文网首页让前端飞Front-End
puppeteer踩坑经验之谈

puppeteer踩坑经验之谈

作者: 谭瞎 | 来源:发表于2019-02-19 17:16 被阅读0次

    启动浏览器

    • 开启浏览器界面:headless: false
    • 开启开发者控制台:devtools: true
    • 自定义浏览器宽高:page.setViewport
    • 产生两个tab页
      • 官方打开页面:await browser.pages(),会产生两个tab页,一个是目标tab页,一个是blank页
      • 修改后:(await browser.pages())[0],仅打开目标tab页
    async init() {
        await this.openPage();
        await this.createCer();
    }
    
    async openPage() {
    
        // 打开浏览器
        browser = await puppeteer.launch({
            headless: false, // 开启界面,
            devtools: true,  // 开启开发者控制台   
        });
    
        // 打开一个空白页
        page = (await browser.pages())[0];
    
        try {
    
            // 设置 浏览器视窗
            await page.setViewport({
                width: 1300,
                height: 938,
            });
    
            // 跳转 目的页
            await page.goto("http://127.0.0.1/demo.html");
    
        } catch (error) {
            await this.openPage();
            throw new Error('请求页面超时,尝试重新连接');
        }
    }
    

    操作页面

    • 为了能够获取目标节点,当遇到页面跳转的时、点击下拉时、可先等待随机秒数:await page.waitFor(utilFun.random(1000, 3000));
    • 想获取元素的属性:page.$eval()
    • 想操作dom元素:page.evaluate()
      • 为了能够准确获取dom元素,可使用setTimeout延时诺干秒后,再进行相应操作
    • 正则中若想含有变量: let reg = new RegExp(${username});
    async createCer() {
       
        const type = this.type;
    
        const Development = "#ios-nav > li:nth-child(1) ul > li:nth-child(3)";
        const Production = await page.$("#ios-nav > li:nth-child(1) ul > li:nth-child(4)");
    
        switch (type) {
            case "dev":
                await this.addIosCertificates(Development);
                break;
            case "dis":
                await this.addIosCertificates(Production);
                break;
            default:
                break
        }
    }
    
    async addIosCertificates(ele) {
    
        // 点击 侧边栏 类型
        await page.waitFor(utilFun.random(1000, 3000));
        await page.click(ele);
    
        // 点击 add 添加IOS证书
        await page.waitFor(utilFun.random(1000, 3000));
        await page.click(".toolbar-button.add");
    
        // 判断 radio 是否能点击
        await page.waitFor(utilFun.random(1000, 3000));
        const radioDisabled = await page.$eval("#type-development-0", async el => {
            return el.disabled;
        });
    
        // 如果证书数量满额,先删除,后增加
        if (radioDisabled) {
    
            // 点击 侧边栏 类型
            await page.waitFor(utilFun.random(1000, 3000));
            await page.click(`${ele}`);
    
            // 删除 IOS证书
            await page.waitFor(utilFun.random(1000, 3000));
            await this.deleteCer();
        } else {
            // 增加 IOS证书
            await this.addCer();
        }
        
    }
    
    async deleteCer() {
        await page.evaluate(async (username) => {
            let tableInfo = "";
            let reg = new RegExp(`${username}`);
            const table = document.querySelectorAll(".data-table")[1].querySelector("tbody");
    
            for (let i = 0; i < table.rows.length; i++) {
                for (let j = 0; j < table.rows[i].cells.length; j++) {
                    tableInfo = table.rows[i].cells[j].innerText;
                    if (reg.test(tableInfo) && (i % 2 == 0)) {
                        // 名字
                        let name = table.rows[i].cells[j].innerText;
                        // 类型
                        let type = table.rows[i].cells[j + 1].innerText;
                        // 期限
                        let expires = table.rows[i].cells[j + 2].innerText;
    
                        // 点击 下拉
                        table.rows[i].click();
    
                        // 点击 Revoke
                        setTimeout(() => {
                            document.querySelector(".button-no-padding-top.small.revoke-button").click();
                        }, 1000);
    
                        // 点击 弹窗 Revoke
                        setTimeout(() => {
                            document.querySelector(".ui-dialog-content.ui-widget-content .button.small.red.ok").click();
                        }, 3000);
    
                    }
                }
            }
    
        }, username);
    }
    

    上传文件

    // 点击 选择文件
    await page.waitFor(utilFun.random(1000, 3000));
    const upload_file = await page.$("input[type=file]");
    await upload_file.uploadFile("你的文件路径");
    

    文件下载

    // 下载 IOS 证书
    await this.downloadFile("你的文件路径");
    
    await page.waitFor(utilFun.random(1000, 3000));
    await page.click(".button.small.blue");
    

    相关文章

      网友评论

        本文标题:puppeteer踩坑经验之谈

        本文链接:https://www.haomeiwen.com/subject/ecpfyqtx.html