Puppeteer筆記(六):Puppeteer切換frame操作


Puppeteer系列

1、Puppeteer筆記(一):Puppeteer簡介

2、Puppeteer筆記(二):Puppeteer安裝及實例Demo

3、Puppeteer筆記(三):Puppeteer獲取元素及元素屬性 

4、Puppeteer筆記(四):Puppeteer模擬鍵盤 

5、Puppeteer筆記(五):Puppeteer文件上傳

6、Puppeteer筆記(六):Puppeteer切換frame操作 

7、Puppeteer筆記(七):Puppeteer切換瀏覽器TAB頁 

8、Puppeteer筆記(八):Puppeteer執行自定義Javascript方法 

一、puppeteer切換iframe操作

1、page.frames()   加載到頁面中的所有iframe標簽

2、frame.url()    返回frame框架的url

 二、上手實例Demo

  功能測試:打開安居客,可看到登錄頁是一個iframe嵌入的頁面,如何定位進行登錄。

  先以我們平常的思維來看,打開一個頁面就直接定位,嘗試一下不在iframe,是否可以定位成功。代碼如下:

 1 const puppeteer = require('puppeteer');
 2 //puppeteer切換iframe進行安居客登錄操作
 3 async function anjuke() {
 4     //創建一個Browser瀏覽器實例,並設置相關參數
 5     const browser = await puppeteer.launch({
 6         headless: false,
 7         defaultViewport: null,
 8         args: ['--start-maximized'],
 9         ignoreDefaultArgs: ['--enable-automation']
10     });
11     //創建一個Page實例
12     const page = await browser.newPage();
13     /*打開安居客首頁
14     waitUntil:代表什么時候才認為導航加載成功
15     networkidle0: 在 500ms 內沒有網絡連接時就算成功(全部的request結束),才認為導航結束
16     networkidle2: 500ms 內有不超過 2 個網絡連接時就算成功(還有兩個以下的request),就認為導航完成。
17     */
18     await page.goto('https://login.anjuke.com/login/form', {
19         waitUntil: 'networkidle2'
20     });
21     //不在具體iframe中,直接定位元素
22     const phone = await page.$('#phoneIpt');
23     phone.type('123456');
24     await page.waitFor(3000);
25     await browser.close();
26 }
27 anjuke();

   運行以上代碼,我們可以發現,終端有報錯。可看出不能直接操作iframe中的元素。

   那我們來看看如何切換frame進行頁面元素的相關操作。代碼如下:

 1 const puppeteer = require('puppeteer');
 2 //puppeteer切換iframe進行安居客登錄操作
 3 async function anjuke() {
 4     //創建一個Browser瀏覽器實例,並設置相關參數
 5     const browser = await puppeteer.launch({
 6         headless: false,
 7         defaultViewport: null,
 8         args: ['--start-maximized'],
 9         ignoreDefaultArgs: ['--enable-automation']
10     });
11     //創建一個Page實例
12     const page = await browser.newPage();
13     /*打開安居客首頁
14     waitUntil:代表什么時候才認為導航加載成功
15     networkidle0: 在 500ms 內沒有網絡連接時就算成功(全部的request結束),才認為導航結束
16     networkidle2: 500ms 內有不超過 2 個網絡連接時就算成功(還有兩個以下的request),就認為導航完成。
17     */
18     await page.goto('https://login.anjuke.com/login/form', {
19         waitUntil: 'networkidle2'
20     });
21     //找到頁面所有的iframe並打印出iframe鏈接,frame.url()獲取frame的url
22     await page.frames().map(frame => {
23         console.log(frame.url())
24     });
25     const targetFrameUrl = 'https://login.anjuke.com/login/iframeform';
26     //找到要定位的iframe頁面
27     const frame = await page.frames().find(frame => frame.url().includes(targetFrameUrl));
28     //在定位的iframe頁面內操作
29     const phone = await frame.waitForSelector('#phoneIpt');
30     phone.type('123456');
31     await page.waitFor(3000);
32     await browser.close();
33 }
34 anjuke();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM