今天解決的問題是切換窗口的問題,頁面點擊元素后是尔,在本頁面還好殉了,直接進行操作就好了,有時會打開一個新的頁面拟枚,句柄還停留在第一個頁面薪铜,直接操作會報錯众弓,需要切換到新頁面進行操作,
下面上調試好的代碼:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
//打開掘進首頁隔箍,點擊第一個文章鏈接
await page.goto('https://juejin.im/');
await page.setViewport({width:1280,height:800});
await page.waitFor('#juejin > div.view-container > main > div > div.feed.welcome__feed > ul > li:nth-child(1) > div > div > a > div > div > div.info-row.title-row > a');
await page.tap('#juejin > div.view-container > main > div > div.feed.welcome__feed > ul > li:nth-child(1) > div > div > a > div > div > div.info-row.title-row > a');
//跳轉到第二個窗口輸入文字
await page.waitFor(3000);//等待3秒谓娃,等待新窗口打開
const page2 = ( await browser.pages() )[2];//得到所有窗口使用列表索引得到新的窗口
await page2.setViewport({width:1280,height:800});
await page2.waitFor('.search-input');
await page2.type('.search-input','succeed');//在新窗口中輸入文字
const title = await page2.title();//得到新窗口的標題
console.log(title);//打印新窗口的標題
})();
解析:第10行以前就不用說了,打開一個瀏覽器進入掘進首頁蜒滩,點擊文章滨达,打開新的頁面
1、第12行我加了3秒的等待俯艰,因為點擊完文章后捡遍,后會立即執(zhí)行腳本browser.pages(),而新的頁面有時還沒打開竹握,就會獲取不到画株,所以加一個等待,等待新頁面完全打開啦辐。
2谓传、第13行中我使用索引的方法來獲取最新的頁面,因為返回的是一個列表芹关,這里有一個要注意,索引前面的腳本要加括號续挟,不然會出錯
const page2 = ( await browser.pages() )[2];//得到所有窗口使用列表索引得到新的窗口
3、后邊就是正常的操作了侥衬,page2就是新的頁面诗祸,page就是舊的頁面可以直接進行操作
PS:這里留意個注意事項,如果大家有遇到的可以看看
我在做web網頁UI自動化時候也會遇到要切換窗口浇冰,我當時是得到所有的句柄使用索引進行切換的贬媒。
但是注意啦:有時候會遇到一個問題聋亡,就是窗口的句柄順序會經常不一樣V庀啊(在puppeteer中暫時還沒遇到這種情況)
舉個例子:同一個腳本,得到句柄列表順序坡倔,第一次得到的句柄是[1,2,3]漂佩,但是第二次運行得到的句柄列表是[1,3,2],第三次得到的句柄是[2,1,3]罪塔,不知道大家有沒有明白投蝉,句柄并不會按照打開的順序來依次排序,所以使用索引就會有時成功有時失敗征堪,
我這邊寫一下我當時解決的思路:
環(huán)境是:Python + robotframework
首先:得到只有一個窗口的列表x=[1]瘩缆,在得到有兩個窗口的列表y=[1,2],在得到有三個窗口的列表z=[2,3,1]佃蚜,在Python中進行處理:把列表轉換成元祖庸娱,進行相減着绊,在轉換成列表返回
腳本如下:
list(set(y)-set(x)[0]
圖示如下:
要切換到第3個窗口:用3個的窗口列表減去2個窗口的列表
要切換到第2個窗口:用2個的窗口列表減去1個窗口的列表