Selenium-Grid版本
selenium-grid分為版本1和版本2,其實(shí)它的2個(gè)版本并不是和selenium的版本1和2相對(duì)應(yīng)發(fā)布的[即selenium-grid2的發(fā)布比selenium2要晚一點(diǎn)]。不過幸運(yùn)的是現(xiàn)在的selenium-grid2基本能支持selenium2的所有功能了。
selenium雖然分1和2,但其實(shí)原理和基本工作方式都是一樣的。只是版本2同時(shí)支持selenium1和selenium2兩種協(xié)議,并且在一些小的功能和易用性上進(jìn)行了優(yōu)化。比如:指定測(cè)試平臺(tái)的方式;以下未作特殊說明的Selenium-Grid均為通用。
Selenium1工作原理
selenium1中除了使用selenium-core以外,進(jìn)行自動(dòng)化測(cè)試時(shí)都需要使用selenium-RC來作為代理[不管是本機(jī)還是遠(yuǎn)程],目的是為了解決同源問題;而造成同源問題的原因是因?yàn)閟elenium1中是使用Javascript來驅(qū)動(dòng)測(cè)試執(zhí)行的【瀏覽器由于安全問題不允許不同域之間的JS調(diào)用,即非同源不可調(diào)用;而selenium1中的工作方式是在宿主頁面注入JS并且通過調(diào)用JS來執(zhí)行測(cè)試操作的,所以設(shè)計(jì)到同源問題】。所以為了達(dá)成目的,其解決方案有2種:
1、使用selenium-core:
selenium-core是一組js庫,用來驅(qū)動(dòng)瀏覽器操作的所有庫文件都在這里,整個(gè)selenium1可以認(rèn)為核心組件是這個(gè)selenium-core;而使用selenium-core的方式是在被測(cè)試站點(diǎn)程序的源碼里把selenium-core中的所有js庫直接添加到頁面里,這樣頁面正常加載的同時(shí)也會(huì)把selenium-core加載下來,并且天生是同源的。
2、使用selenium-RC:
RC是一個(gè)http代理程序,用來注入到瀏覽器和被測(cè)web程序之間,這樣瀏覽器所有的請(qǐng)求和接收的內(nèi)容都會(huì)通過RC;RC會(huì)把瀏覽器的請(qǐng)求發(fā)送給真實(shí)的web程序,而在接收到web程序的響應(yīng)內(nèi)容時(shí),并沒有把內(nèi)容原原本本的返回給瀏覽器客戶端,而是把包含selenium-core的內(nèi)容注入到響應(yīng)內(nèi)容中去,然后才發(fā)送響應(yīng)內(nèi)容給瀏覽器,這樣通過欺騙的方式讓瀏覽器認(rèn)為selenium1的驅(qū)動(dòng)類庫同樣是同源的。
Selenium2工作原理
selenium2中因?yàn)槭褂玫膚ebdriver,這個(gè)技術(shù)不是靠js驅(qū)動(dòng)的,而是直接調(diào)用瀏覽器的原生態(tài)接口驅(qū)動(dòng)的。所以沒有同源問題,也不需要使用RC來執(zhí)行本地腳本了【當(dāng)然缺點(diǎn)是并不是所有的瀏覽器都有提供很好的驅(qū)動(dòng)支持,但JS卻是所有瀏覽器都通用的】。所以selenium2中執(zhí)行本地腳本的方式是:通過本地webdriver驅(qū)動(dòng)直接調(diào)用本地瀏覽器接口完事了。在本地調(diào)用本地的代碼是這樣的:
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.*;
WebDriver wd = new FirefoxDriver();
wd.doSomething()
但有時(shí)候并總是只執(zhí)行本地測(cè)試的腳本,有時(shí)候可能需要在本地調(diào)用遠(yuǎn)程的環(huán)境來執(zhí)行測(cè)試,【比如:因?yàn)闇y(cè)試環(huán)境覆蓋原因】此時(shí)需要一個(gè)類似selenium1中的RC來承擔(dān)這個(gè)任務(wù),也是selenium2中的selenium-server。selenium-server支持接收遠(yuǎn)程腳本的調(diào)用命令,然后操作其宿主機(jī)上的瀏覽器來到遠(yuǎn)程執(zhí)行測(cè)試的任務(wù)。當(dāng)然selenium-server為了兼容selenium1的腳本,它同樣也支持selniumRC所支持的功能【即能接收selenium1的調(diào)用命令】。在本地調(diào)用遠(yuǎn)程機(jī)器執(zhí)行測(cè)試的代碼是這樣的:
import org.openqa.selenium.*;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
DesiredCapabilities ieDesiredcap = DesiredCapabilities.internetExplorer();
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", ieDesiredcap);
wd.doSomething()
但是在運(yùn)行這段代碼之前,要先啟動(dòng)Selenium-Server;啟動(dòng)命令為:
java -jar selenium-server-standalone-x.xx.x.jar
調(diào)用selenium-server對(duì)應(yīng)的結(jié)構(gòu)圖: