前端神器puppeteer入門(mén)及實(shí)踐(1)

前面寫(xiě)過(guò)的phantomJs定铜,研究幾天后發(fā)現(xiàn)phantomJs雖然在業(yè)內(nèi)有一定的影響力阳液,但后繼乏力,主要還是缺乏維護(hù)人員揣炕,導(dǎo)致項(xiàng)目依賴的chrome內(nèi)核版本太低帘皿,無(wú)人解決的BUG太多(1000+),現(xiàn)在這個(gè)環(huán)境已經(jīng)越來(lái)越滿足不了真實(shí)的前端模擬以及各種新的特性需求(比如高版本Chrome的執(zhí)行環(huán)境特性畸陡,比如JS執(zhí)行和渲染等都相差很大)鹰溜,GitHub參照:點(diǎn)擊這里

谷歌瀏覽器在17年自行開(kāi)發(fā)了Chrome Headless特性丁恭,并與之同時(shí)推出了puppeteer奉狈,可以理解成我們?nèi)粘J褂玫腃hrome的無(wú)界面版本以及對(duì)其進(jìn)行操控的js接口套裝,官方介紹參照:點(diǎn)擊這里涩惑。

借助puppeteer仁期,我們實(shí)際上是通過(guò)調(diào)用Chrome DevTools開(kāi)放的接口與Chrome通信,Chrome DevTools的接口很復(fù)雜竭恬,但puppeteer對(duì)其進(jìn)行了封裝跛蛋,我們調(diào)用起來(lái)還是很方便的。寫(xiě)幾個(gè)簡(jiǎn)單例子:

Demo1:打開(kāi)百度痊硕,并保存截圖

下面代碼保存在 baidu.js中(當(dāng)然需要提前初始化package.json等操作赊级,默認(rèn)大家都了解的):

const puppeteer = require('puppeteer');

(async () => {

? ? const browser = await puppeteer.launch({

? ? ? ? headless: true

? ? })

? ? const page = await browser.newPage()

? ? await page.goto('http://www.baidu.com')

? ? await page.screenshot({

? ? ? ? path: 'c:/temp/baidu.png'

? ? })

})()

通過(guò) node baidu.js 就可以將截圖保存下來(lái),下面是效果圖:


當(dāng)然上面的只是最簡(jiǎn)單的操作岔绸,涉及到的API也少理逊,查看完整API可以:點(diǎn)擊這里

再來(lái)豐富下上面的操作:

Demo2:iPhoneX模式打開(kāi)百度,并保存截圖

代碼如下盒揉,相比demo1其實(shí)只是多了幾行代碼晋被,也就是調(diào)用了 page.emulate方法按照給定設(shè)備對(duì)頁(yè)面的尺寸進(jìn)行了設(shè)定:

const devices = require('puppeteer/DeviceDescriptors')

const puppeteer = require('puppeteer');

(async () => {

? ? const browser = await puppeteer.launch({

? ? ? ? headless: true

? ? })

? ? const page = await browser.newPage()

? ? await page.emulate(devices['iPhone X'])

? ? await page.goto('http://www.baidu.com')

? ? await page.screenshot({

? ? ? ? path: 'c:/temp/baidu_iphone_X.png'

? ? })

})()

截圖如下:


針對(duì)device設(shè)備的完整列表,可以參照源碼:點(diǎn)擊這里刚盈,(PS:大家都要學(xué)會(huì)找源碼羡洛,讀源碼,項(xiàng)目中經(jīng)常碰到引用插件的問(wèn)題藕漱,通過(guò)查找源碼可以加深對(duì)問(wèn)題的理解欲侮,才可能真正解決)

上面兩個(gè)例子都是比較簡(jiǎn)單的操作崭闲,只有加載頁(yè)面和截圖,沒(méi)有用戶交互操作威蕉,我們繼續(xù)

Demo3:iPhoneX模式打開(kāi)百度刁俭,搜索puppeteer關(guān)鍵字,跳轉(zhuǎn)到查詢結(jié)果頁(yè)面后韧涨,保存截圖

這個(gè)demo真正增加的步驟也就三個(gè):

找到 輸入文本框 并填充關(guān)鍵字 puppeteer薄翅;

找到 百度一下 按鈕并點(diǎn)擊;

等待頁(yè)面跳轉(zhuǎn)顯示查詢結(jié)果氓奈;

代碼如下:

const devices = require('puppeteer/DeviceDescriptors')

const puppeteer = require('puppeteer');

(async () => {

? ? const browser = await puppeteer.launch({

? ? ? ? headless: true

? ? })

? ? const page = await browser.newPage()

? ? await page.emulate(devices['iPhone X'])

? ? await page.goto('http://www.baidu.com')

? ? await page.type('#index-kw', 'puppeteer')

? ? await page.click('#index-bn')

? ? await page.waitForNavigation({ timeout: 3000 })

? ? await page.screenshot({

? ? ? ? path: 'c:/temp/baidu_iphone_X_search_puppeteer.png'

? ? })

})()

上面的加粗的三行代碼就對(duì)應(yīng)多出的三個(gè)步驟,需要留意的是鼎天,在PC直接訪問(wèn)百度和模擬iPhoneX訪問(wèn)百度拿到的文本框和按鈕的id是不同的舀奶,也就是說(shuō),百度并不是直接拿一個(gè)站點(diǎn)做mediaQuery之類(lèi)設(shè)置供PC和移動(dòng)端共享斋射,而是兩個(gè)完全不同的頁(yè)面育勺,這里不討論優(yōu)缺點(diǎn),如果大家想要在PC看iPhoneX訪問(wèn)的效果就要利用ChromeDevTools改下設(shè)置:


兩個(gè)紅色方框是設(shè)置的地方罗岖,藍(lán)色方框標(biāo)注兩個(gè)元素的id


最終截圖見(jiàn)下:



好了涧至,puppeteer的入門(mén)及實(shí)踐(1)就到此為止了,總結(jié)下桑包,puppeteer作為谷歌出品的前端利器南蓬,想象空間是很大的,在爬蟲(chóng)哑了、測(cè)試自動(dòng)化等方面都可以很好勝任赘方,跟其他測(cè)試工具不同,不再是模擬谷歌執(zhí)行引擎再去渲染弱左,而是一個(gè)真正在運(yùn)行的瀏覽器窄陡,只是移除了真實(shí)的界面渲染。作為一個(gè)入門(mén)課程拆火,很多細(xì)節(jié)都沒(méi)詳述跳夭,比如可以通過(guò)傳參 headless: false 讓puppeteer操作Chrome的過(guò)程可視化,各步驟可以指定間隔時(shí)間们镜,還有插件可以錄制等币叹,這些更精彩的留待后面再寫(xiě)。


文中所有DEMO源碼參照:

https://github.com/wu0792/puppeteer_01

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末模狭,一起剝皮案震驚了整個(gè)濱河市套硼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胞皱,老刑警劉巖邪意,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件九妈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雾鬼,警方通過(guò)查閱死者的電腦和手機(jī)萌朱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)策菜,“玉大人晶疼,你說(shuō)我怎么就攤上這事∮趾” “怎么了翠霍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蠢莺。 經(jīng)常有香客問(wèn)我寒匙,道長(zhǎng),這世上最難降的妖魔是什么躏将? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任锄弱,我火速辦了婚禮,結(jié)果婚禮上祸憋,老公的妹妹穿的比我還像新娘会宪。我一直安慰自己,他們只是感情好蚯窥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布掸鹅。 她就那樣靜靜地躺著,像睡著了一般拦赠。 火紅的嫁衣襯著肌膚如雪河劝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天矛紫,我揣著相機(jī)與錄音赎瞎,去河邊找鬼。 笑死颊咬,一個(gè)胖子當(dāng)著我的面吹牛务甥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喳篇,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼敞临,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了麸澜?” 一聲冷哼從身側(cè)響起挺尿,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后编矾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體熟史,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年窄俏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹂匹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凹蜈,死狀恐怖限寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仰坦,我是刑警寧澤履植,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站悄晃,受9級(jí)特大地震影響玫霎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜传泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸭巴。 院中可真熱鬧眷细,春花似錦、人聲如沸鹃祖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恬口。三九已至校读,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祖能,已是汗流浹背歉秫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留养铸,地道東北人雁芙。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钞螟,于是被迫代替她去往敵國(guó)和親兔甘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.puppeteer簡(jiǎn)介 puppeteer是一個(gè)node庫(kù)鳞滨,是Google chrome團(tuán)隊(duì)官方的無(wú)界面(he...
    伊人風(fēng)采_690d閱讀 7,616評(píng)論 0 11
  • 打算用vue等mvvm的框架做單頁(yè)應(yīng)用熔任,seo是一個(gè)頭疼的問(wèn)題。雖然官方提供了服務(wù)端渲染的方案仙蛉,總覺(jué)著那樣就失去了...
    UU小寶閱讀 7,215評(píng)論 3 51
  • 出現(xiàn)的背景 Chrome59(linux笋敞、macos)、 Chrome60(windows)之后荠瘪,Chrome自帶...
    undefinedR閱讀 68,787評(píng)論 12 48
  • 這本書(shū)拖的時(shí)間有點(diǎn)久了夯巷,很早就開(kāi)始看了。但是自己實(shí)在是懶哀墓,并非提不起興致趁餐,只是很多時(shí)候忙這忙那的毛病,就把看書(shū)這件...
    吼啾啾閱讀 379評(píng)論 0 0
  • 我不適合教書(shū)篮绰。因?yàn)槲业姆中陌Y后雷。教書(shū)需要集中注意力。學(xué)生和小學(xué)的教材不足以吸引我吠各,激發(fā)我去研究臀突。我的神游,常常使我忘...
    屋頂上的魚(yú)閱讀 167評(píng)論 0 0