理解瀏覽器兼容性自動(dòng)化測(cè)試過(guò)程

概述

瀏覽器兼容性是目前前端項(xiàng)目迭代中常常遇到的問(wèn)題.

每次迭代, 回歸測(cè)試需要消耗大量人力進(jìn)行手動(dòng)操作, 去覆蓋不同瀏覽器下不同業(yè)務(wù)場(chǎng)景的前端展示情況.

本文的目的即探討解決這類(lèi)問(wèn)題的一個(gè)方案: 利用分布式的UI自動(dòng)化測(cè)試框架Selenium Grid解決跨瀏覽器的兼容性問(wèn)題.

技術(shù)方案

  • Python + Selenium3, 用于驅(qū)動(dòng)不同的瀏覽器執(zhí)行驗(yàn)證操作
  • Selenium Grid, 用于實(shí)現(xiàn)分布式執(zhí)行用例
  • VMware, 安裝不同種類(lèi)瀏覽器, 作為執(zhí)行節(jié)點(diǎn)

Selenium原理

通過(guò)Selenium控制瀏覽器模擬人工操作的過(guò)程如下:

Selenium原理.png

WebDriver充當(dāng)一個(gè)HTTP Server的角色, 它接收Selenium客戶(hù)端發(fā)來(lái)的請(qǐng)求, 同時(shí)根據(jù)不同的請(qǐng)求內(nèi)容對(duì)瀏覽器進(jìn)行不同的操作.

Selenium封裝了WebDriver所能接收的各類(lèi)請(qǐng)求路由(URL)和內(nèi)容(Body)期虾,Python代碼在調(diào)用Selenium庫(kù)時(shí)其實(shí)是在操作Selenium庫(kù)發(fā)送這些HTTP請(qǐng)求妖爷。

在代碼執(zhí)行之初蔓榄,我們需要初始化一個(gè)webdriver對(duì)象,初始化的過(guò)程中浑塞,實(shí)際上是Selenium庫(kù)啟動(dòng)了一個(gè)子進(jìn)程,將WebDriver程序運(yùn)行在后臺(tái)中遭顶,監(jiān)聽(tīng)接下來(lái)Selenium客戶(hù)端發(fā)來(lái)的請(qǐng)求喇聊。

Selenium客戶(hù)端,WebDriver與瀏覽器之間通過(guò)初始化瀏覽器時(shí)生成的SessionID進(jìn)行瀏覽器對(duì)象綁定务豺,使得Python代碼能夠準(zhǔn)確的控制某一瀏覽器窗口磨总。

Selenium Grid原理

Selenium Grid 允許我們?cè)诓煌瑱C(jī)器/瀏覽器上, 同時(shí)執(zhí)行測(cè)試用例.

一個(gè)Selenium Grid結(jié)構(gòu)中包括一個(gè)主節(jié)點(diǎn)(hub)和多個(gè)從節(jié)點(diǎn)(node). 主從節(jié)點(diǎn)都是通過(guò)運(yùn)行selenium-server-standalone.jar啟動(dòng).

Selenium 客戶(hù)端(如本項(xiàng)目)運(yùn)行在hub上, 通過(guò)Selenium Grid將操作瀏覽器的指令分發(fā)到各個(gè)node中, 即實(shí)現(xiàn)了分布式執(zhí)行測(cè)試用例.

主從結(jié)構(gòu)的優(yōu)勢(shì)在于, 無(wú)需在所有從節(jié)點(diǎn)上配置執(zhí)行環(huán)境(如Python和Selenium庫(kù)), 即可直接執(zhí)行主節(jié)點(diǎn)發(fā)來(lái)的執(zhí)行指令.

Selenium-grid架構(gòu)圖.png

技術(shù)實(shí)現(xiàn)

自動(dòng)化測(cè)試代碼

我們可以使用各種語(yǔ)言編寫(xiě)Selenium客戶(hù)端執(zhí)行程序,因?yàn)閺腟elenium原理上可知笼沥,WebDriver本身是一個(gè)HTTP Server蚪燕,只要程序語(yǔ)言支持發(fā)送HTTP請(qǐng)求都能實(shí)現(xiàn)自動(dòng)化測(cè)試的過(guò)程。本文將使用Python編碼奔浅。

自動(dòng)化執(zhí)行過(guò)程

引用Selenium庫(kù)

Selenium的Python庫(kù)已由官方實(shí)現(xiàn)馆纳,直接安裝然后調(diào)用即可。

安裝:

pip install selenium==3.141.0

引入:

from selenium import webdriver
初始化webdriver

以Chrome瀏覽器為例:

driver = webdriver.Chrome()

我們可以打開(kāi)Chrome()這個(gè)類(lèi)查看__init__方法汹桦,可以看到主要過(guò)程就是設(shè)置capabilities參數(shù)用來(lái)指定需要操作的對(duì)象是Chrome鲁驶,然后在后臺(tái)啟動(dòng)了一個(gè)子進(jìn)程(selenium/webdriver/common/service.pyService類(lèi)的start方法),這個(gè)過(guò)程與在終端中啟動(dòng)chromedriver的效果類(lèi)似舞骆,都是啟動(dòng)了一個(gè)HTTP server钥弯,用于接收接下來(lái)的Selenium客戶(hù)端的請(qǐng)求径荔。

打開(kāi)瀏覽器

從這步開(kāi)始,代碼其實(shí)是在不斷的給WebDriver這個(gè)server發(fā)送HTTP請(qǐng)求了脆霎。

driver.get(url)

執(zhí)行成功总处,將會(huì)打開(kāi)一個(gè)瀏覽器頁(yè)面。

查找元素

查找元素的方法有很多睛蛛,這里以CSS為例鹦马,查找一個(gè)按鈕的元素ID:

element = driver.find_element_by_css_selector(submit_btn)

查找到元素后,WebDriver會(huì)返回元素的ID等信息忆肾,Selenium客戶(hù)端會(huì)創(chuàng)建一個(gè)WebElement對(duì)象存儲(chǔ)這個(gè)元素信息荸频。

執(zhí)行點(diǎn)擊操作

WebElement類(lèi)中包含封裝好的click卫旱,submit等多種操作棒假,許多操作過(guò)程實(shí)際是以JavaScript代碼執(zhí)行姜胖。

有了這些封裝好的方法蹬跃,執(zhí)行點(diǎn)擊某元素的操作就很簡(jiǎn)單了:

element.click()

測(cè)試結(jié)果判斷

有了自動(dòng)化執(zhí)行的過(guò)程内舟,作為自動(dòng)化測(cè)試钧惧,少不了測(cè)試的過(guò)程需五。

測(cè)試框架

測(cè)試框架可以使用Python自帶的unittest即可讼撒,在setUp方法中初始化瀏覽器對(duì)象燎窘,在每個(gè)測(cè)試用例中使用封裝好的斷言方法對(duì)操作的響應(yīng)進(jìn)行比較并返回結(jié)果摹闽。

更多可能性

在機(jī)器學(xué)習(xí)應(yīng)用日趨廣泛的情況下,提取預(yù)期結(jié)果的特征褐健,訓(xùn)練出符合自己業(yè)務(wù)的機(jī)器學(xué)習(xí)模型付鹿,將每次執(zhí)行操作的結(jié)果截圖作為模型輸入,可能能夠解決UI自動(dòng)化測(cè)試需要主觀判斷測(cè)試結(jié)果的難題蚜迅。

Selenium Grid分布式執(zhí)行用例

環(huán)境準(zhǔn)備

對(duì)于hub, 需要安裝:

  • JDK8環(huán)境, 用于提供selenium-server-standalone.jar包的運(yùn)行環(huán)境
  • selenium-server-standalone.jar, 用于建立與node的連接
  • Python3環(huán)境, 用于執(zhí)行UI測(cè)試代碼

對(duì)于node, 需要安裝:

  • JDK8環(huán)境, 用于提供selenium-server-standalone.jar包的運(yùn)行環(huán)境
  • selenium-server-standalone.jar, 用于建立與hub的連接
  • WebDriver, 用于控制瀏覽器執(zhí)行操作指令
主節(jié)點(diǎn)
  1. 以hub角色啟動(dòng)Selenium-server:
java -jar selenium-server-standalone-3.141.59.jar -role hub

待node節(jié)點(diǎn)連接成功后, 在hub節(jié)點(diǎn)上執(zhí)行本項(xiàng)目代碼, 即可看到node節(jié)點(diǎn)上的瀏覽器啟動(dòng)并執(zhí)行相應(yīng)操作.

從節(jié)點(diǎn)
  1. 以node角色啟動(dòng)Selenium-server:
java -jar selenium-server-standalone-3.141.59.jar -role node 
  -hub http://<IP>:4444/grid/register \
  -browser "browswerName=<BrowserName>,\
    version=<Version>,\
    platform=<PLATFORM>"

參數(shù)說(shuō)明:

  • <IP>: hub節(jié)點(diǎn)的IP, 注意hub節(jié)點(diǎn)與node節(jié)點(diǎn)需要互通, 若是虛擬機(jī), 需要將網(wǎng)絡(luò)配置為橋接(Bridge)模式
  • <BrowserName>: 瀏覽器名, 如: internet explorer, chrome, firefox等
  • <Version>: 瀏覽器版本號(hào): 以IE9為例, version=9
  • <PLATFORM>: 系統(tǒng)類(lèi)型, 如: WINDOWS, LINUX等

在連接成功后可以看到控制臺(tái)中的一段信息:

Capabilities are: {
    "browswerName": "internet explorer",
    "platform": "WINDOWS",
    "version":""
}

這段瀏覽器配置信息是用于Selenium客戶(hù)端連接所用:

browser = webdriver.Remote(
    command_executor = 'http://localhost:4444/wd/hub',
    desired_capabilities={
        "browswerName": "internet explorer",
        "platform": "WINDOWS",
        "version":""
    }
)

執(zhí)行過(guò)程

修改WebDriver入口

由于所有的瀏覽器入口都統(tǒng)一成Hub節(jié)點(diǎn)的server舵匾,因此需要將WebDriver初始化入口代碼修改。以IE為例:

driver = webdriver.Remote(
    command_executor = 'http://localhost:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.INTERNETEXPLORER
)
運(yùn)行

除了WebDriver入口的修改谁不,其他代碼可以基本保持不動(dòng)坐梯。
和單機(jī)的Selenium環(huán)境一樣,在Hub節(jié)點(diǎn)上直接運(yùn)行測(cè)試代碼即可刹帕,運(yùn)行后吵血,Node中可用的某個(gè)IE瀏覽器將被啟動(dòng)并執(zhí)行接下來(lái)的操作。

參考文檔

  1. Wire Protocol, Selenium, Github Wiki
  2. Selenium Grid, Selenium, Github Wiki
  3. Selenium with Python, Selenium, Readthedocs
  4. InternetExplorerDriver, Selenium, Github Wiki

實(shí)現(xiàn)代碼

  1. https://github.com/ityoung/parallel-selenium
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偷溺,一起剝皮案震驚了整個(gè)濱河市蹋辅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挫掏,老刑警劉巖侦另,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淋肾,警方通過(guò)查閱死者的電腦和手機(jī)硫麻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)爸邢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)樊卓,“玉大人,你說(shuō)我怎么就攤上這事杠河÷刀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵券敌,是天一觀的道長(zhǎng)唾戚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)待诅,這世上最難降的妖魔是什么叹坦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮卑雁,結(jié)果婚禮上募书,老公的妹妹穿的比我還像新娘。我一直安慰自己测蹲,他們只是感情好莹捡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扣甲,像睡著了一般篮赢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琉挖,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天启泣,我揣著相機(jī)與錄音,去河邊找鬼示辈。 笑死寥茫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顽耳。 我是一名探鬼主播坠敷,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼射富!你這毒婦竟也來(lái)了膝迎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胰耗,失蹤者是張志新(化名)和其女友劉穎限次,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卖漫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年费尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊始。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旱幼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突委,到底是詐尸還是另有隱情柏卤,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布匀油,位于F島的核電站缘缚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敌蚜。R本人自食惡果不足惜桥滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弛车。 院中可真熱鬧齐媒,春花似錦、人聲如沸帅韧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忽舟。三九已至双妨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叮阅,已是汗流浹背刁品。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浩姥,地道東北人挑随。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像勒叠,于是被迫代替她去往敵國(guó)和親兜挨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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