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