欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

采用selenium+phantomJS獲取頁面源碼為什么得不到渲染后的內容?

錢琪琛2年前13瀏覽0評論

在BAT里實習的時候,曾經(jīng)封裝過selenium做了一個自動化測試的工具。selenium是瀏覽器自動化測試領域常用的一個工具,支持Chrome,F(xiàn)irefox,Safari,IE和phantomjs等,能夠像真正的用戶一樣操作瀏覽器。

它的應用主要在兩個場景:

1)測試與瀏覽器的兼容性,比如要測試你的網(wǎng)頁能否在不同的瀏覽器和操作系統(tǒng)上正常展示和運作。

2)測試系統(tǒng)功能,通過編寫腳本來創(chuàng)建回歸測試,檢驗待測服務的功能是否依舊正常。

對selenium不熟悉的人也許會說,前面幾個瀏覽器我都聽過用過,但是最后的這個phantomjs是什么呢。phantomjs是一個無頁面的瀏覽器,由于無頁面,也就說明它的定位并不是給用戶來瀏覽網(wǎng)頁查詢資料的,而正由于無頁面,它的并發(fā)量可以達到非常大的程度,一臺標準配置的電腦,同時并發(fā)30個phantomjs線程是沒有問題的(如果這臺電腦打開30個Chrome窗口,估計電腦就卡死了,這就是phantomjs的優(yōu)勢)。

基本上可以認為它就是給selenium用來跑自動化測試專用高并發(fā)瀏覽器,不能給用戶看到頁面(除非調用截圖動作,看截圖),其他方面和Chrome沒什么區(qū)別。

selenium可以通過操作WebDriver句柄來模擬用戶操作,以下介紹幾個常用的driver(WebDriver)對外開發(fā)操作頁面的api):

driver.get("http://www.baidu.com/")//get方法會一直等到頁面加載,然后才會繼續(xù)程序

data=driver.find_element_by_id('wrapper')

.text

//獲取頁面名為wraper的id標簽的文本內容

driver.save_screenshot("baidu.png")//生成頁面快照并保存

driver.find_element_by_id('kw').send_keys(u'長城')//id="kw"是百度搜索輸入框,輸入字符串"長城"

driver.find_element_by_id('su').click()//id="su"是百度搜索按鈕,click()是模擬點擊

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')//ctrl+x剪切輸入框內容

driver.find_element_by_id('su').send_keys(Keys.RETURN)time.sleep(5)//模擬Enter回車鍵

通過以上的api名稱可以看出,在寫代碼的時候,需要實時的打開瀏覽器的調試功能(直接在當前頁面按f12就行),根據(jù)元素的屬性來使用合適的api(按完f12跳出的界面的Elements),如下圖。

但是phantomjs在使用過程中,有一個坑,可能是很多用戶都會遇到的,那就是iframe標簽。

舉例,現(xiàn)在要使用WebElementwe=driver.find_element_by_id('body')語句拿到了一個大的頁面元素,然后我需要拿到這個元素內部的一個子元素,但是如果這個子元素被包在一個iframe中,那么直接用find_element_by_id方法是無法找到這個元素的。

這個時候,就需要你再次使用f12,首先檢查Element中是否真的存在iframe標簽,以及這個iframe的id,然后用driver.switch_to_frame({id名})的方式把句柄切換到這個iframe內部,然后就可以繼續(xù)用driver.find_element_by的方法拿到想要找的元素了。

當然,找完元素之后,別忘了switch_to.default_content(),跳出這個iframe。

以上是我的淺見,歡迎各位在下方評論區(qū)給我交流點贊。

我是蘇蘇思量,來自BAT的Java開發(fā)工程師,每日分享科技類見聞,我,與我共同進步。