您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源功能測(cè)試工具 > Selenium
selenium結(jié)合docker構(gòu)建分布式測(cè)試環(huán)境
作者:不再有的年月 發(fā)布時(shí)間:[ 2017/4/24 11:17:38 ] 推薦標(biāo)簽:Selenium 功能測(cè)試

  selenium是目前web和app自動(dòng)化測(cè)試的主要框架。對(duì)于web自動(dòng)化測(cè)試而言,由于selenium2.0以后socker服務(wù)器由本地瀏覽器自己?jiǎn)?dòng)且直接通過(guò)瀏覽器原生API操作頁(yè)面,故越來(lái)越多的人不再使用selenium RC了。大家使用的大多數(shù)是selenium-client,python版本的selenium-client新版本是3.3.3(2017-04-04發(fā)布),卻忽略了selenium server!事實(shí)上在大型的Grid分布式布局中必須要使用selenium server,我也會(huì)對(duì)這個(gè)布局的使用做一些必要的解釋。在開(kāi)始這個(gè)話題之前我說(shuō)明兩點(diǎn)內(nèi)容:
  第一、寫(xiě)selenium結(jié)合docker的使用只是個(gè)縮影,其實(shí)我想讓大家了解使用docker,你可以不精通但是你得會(huì)用。!
  第二、我不太想寫(xiě)一些關(guān)于selenium的一些基礎(chǔ)操作,如:browser.get(×××),browser.find_element_by_id(×××)....這些大家都會(huì),不會(huì)可以查一些文檔都會(huì)有相應(yīng)的解釋,對(duì)我自己而言我想記錄的是一些關(guān)于比較高級(jí)點(diǎn)的話題,或者在自動(dòng)化過(guò)程中遇到的難題(比如上篇操作flash),又或者selenium中大家忽略的一些方法的使用。
  廢話說(shuō)了不少,開(kāi)始我們的話題selenium結(jié)合docker構(gòu)建分布式測(cè)試環(huán)境。
  1.了解Selenium Standalone Server的使用
  Selenium Standalone Server目前新的版本是3.3.1(dcoker中selenium/hub這個(gè)鏡像下載的也是這個(gè)新的版本),因?yàn)槲覀兊姆植际綔y(cè)試環(huán)境是基于這個(gè)包的使用,我們花一點(diǎn)時(shí)間來(lái)說(shuō)說(shuō)如何使用它。下面是一張Grid分布式布局的基本結(jié)構(gòu):

  上圖中的selenium hub類似于一個(gè)中央處理器,selenium node是遠(yuǎn)程需要執(zhí)行測(cè)試的節(jié)點(diǎn),selenium Test case是運(yùn)行在hub上的測(cè)試用例。
  如何啟動(dòng)一個(gè)selenium hub?
  首先需要java的運(yùn)行環(huán)境,在終端中輸入java -jar selenium-server-standalone-x.xx.x.jar -role hub -參數(shù)。
  關(guān)于這個(gè)啟動(dòng)的參數(shù)其實(shí)是需要我們來(lái)關(guān)注的。我們輸入java -jar selenium-server-standalone-2.52.0.jar -role hub -help下面列出來(lái)很多啟動(dòng)參數(shù),我相信你應(yīng)該能看得懂,在下面的介紹中我也會(huì)提到一些參數(shù)。
  如何向selenium hub中注冊(cè)信息?
  在終端中輸入java -jar selenium-server-standalone-x.xx.x.jar -role node -參數(shù)。
  同理,我們輸入java -jar selenium-server-standalone-2.52.0.jar -role node -help獲取一些啟動(dòng)node的參數(shù)說(shuō)明。
  2.了解docker
  說(shuō)完了Grid的一些原理,我們來(lái)看看docker關(guān)于它的說(shuō)明自行百度。我對(duì)它的簡(jiǎn)單理解如下:
  docker像個(gè)貨船,貨船是干嘛的?裝集裝箱的! 那么這些集裝箱是什么?集裝箱是一個(gè)個(gè)小的容器! 容器是什么? 容器是一個(gè)個(gè)搭建有簡(jiǎn)易linux系統(tǒng)的特定應(yīng)用,比如這個(gè)容器只搭建了java環(huán)境或者只搭建了apache環(huán)境! 容器如何啟動(dòng)它? 通過(guò)鏡像來(lái)啟動(dòng)! 鏡像怎么來(lái)的? 通過(guò)從鏡像源pull或者自己構(gòu)建鏡像!
  自言自語(yǔ)一會(huì),不知道你是否明白我說(shuō)什么了,不明白也沒(méi)關(guān)系,我們結(jié)合搭建分布式環(huán)境這個(gè)應(yīng)用,你應(yīng)該會(huì)明白!
  說(shuō)完了docker是什么,我們著手使用!
  1.如何安裝docker?
  如何安裝docker百度上有很多它的說(shuō)明,由于我的是windows系統(tǒng),關(guān)于它的安裝使用推薦文章如下:
  http://www.jianshu.com/p/4052926bc12c這篇文章講述了用docker搭建spalsh服務(wù)器,里面有詳細(xì)的關(guān)于docker的安裝使用
  2.如何獲取鏡像?
  我們用xshell或者CRT連接docker后,執(zhí)行如下命令:
  docker pull selenium/hub,它會(huì)自動(dòng)從鏡像源中下載新的selenium/hub鏡像
  docker pull selenium/node-firefox,它會(huì)自動(dòng)從鏡像源中下載新selenium/node-firefox鏡像
  當(dāng)然可以用docker pull selenium/node-chrome下載selenium/node-chrome的鏡像,目前是沒(méi)有基于IE或者Safari瀏覽器的鏡像,當(dāng)然我們完全有能力去自己構(gòu)建這些鏡像!這一篇我主要講基于firefox瀏覽器的,其他的類似...
  順便提一句,可以利用docker search+鏡像名稱能搜索鏡像源所存在的鏡像名稱。當(dāng)我們下載完這2個(gè)鏡像后,我們?cè)赬shell中輸入docker images應(yīng)該有如下信息:

  3.如何啟動(dòng)這2個(gè)鏡像?
  上文提到了我們先啟動(dòng)一個(gè)hub,docker啟動(dòng)命令如下:
  Sikilu$ docker run -p 5555:4444 -d --name 'selenium_hub'  selenium/hub做一些簡(jiǎn)單的說(shuō)明:
  run:通過(guò)鏡像啟動(dòng)一個(gè)容器
  -p:端口映射,5555是容器宿主機(jī)的端口是我們docker這個(gè)輪船的端口,4444是我們?nèi)萜鞯亩丝谑俏覀兗b箱的端口。這說(shuō)明了我們把容器的4444端口開(kāi)放給docker主機(jī)的5555端口,那么我們可以通過(guò)docker主機(jī)的5555端口來(lái)訪問(wèn)容器了,有點(diǎn)?嗦~~~
  -d:docker后臺(tái)運(yùn)行這個(gè)容器,我們知道運(yùn)行server-standalone-2.52.0.jar這個(gè)包實(shí)際上是啟動(dòng)一個(gè)socket程序的,是在一個(gè)while循環(huán)中的。如果不啟用后臺(tái)運(yùn)行的話,在xshell當(dāng)前窗口是不能進(jìn)行其他的操作的,當(dāng)然你要再開(kāi)一個(gè)窗口連接docker也可以。
  --name:指定容器運(yùn)行的別名,如果不指定會(huì)隨機(jī)生成一個(gè)。
  selenium/hub:是我們要運(yùn)行的鏡像文件。
  啟動(dòng)完hub后,我們啟動(dòng)一個(gè)node,啟動(dòng)node命令如下:
  docker run -P -d --link selenium_hub:hub  selenium/node-firefox做一些簡(jiǎn)單的說(shuō)明:
  run:和上文相同
  -P:隨機(jī)生成映射端口號(hào),上文中的-p是指定特定的端口號(hào),這里面是node我們并不需要知道容器內(nèi)部的端口號(hào),當(dāng)然你要指定也可以,端口號(hào)不要沖突即可。
  -d:后臺(tái)運(yùn)行與上文相同。
  --link:說(shuō)明我們這個(gè)容器是依賴上文中我們生成的容器selenium_hub,后面我們會(huì)提到link的使用。
  selenium_hub:hub:前面的selenium_hub是我們上文中通過(guò)selenium/hub鏡像啟動(dòng)容器的別名;后面的hub一定要寫(xiě)成hub或者HUB,寫(xiě)成其他啟動(dòng)失敗,為什么這樣我們后面會(huì)和--link一起說(shuō)明。
  selenium/node-firefox:node的鏡像。
  啟動(dòng)了selenium/hub與selenium/node后,我們運(yùn)行docker ps有如下信息:

  我們看出來(lái)相應(yīng)的一些啟動(dòng)信息。
  CONTAINER ID:容器的id號(hào),隨機(jī)生成,我們可以對(duì)他進(jìn)行docker stop +id號(hào)、docker start +id號(hào),或者docker rm+id號(hào)(刪除該容器)
  IMAGE:我們利用到的鏡像文件。
  CMMAND:容器啟動(dòng)時(shí)執(zhí)行的命令,有Dockerfile文件指定,后面提到!
  PORTS:容器的一些端口信息。
  NAMES:注意到,在啟動(dòng)node時(shí)我們沒(méi)有指定--name屬性,所以他隨機(jī)命名了sleepy_bhabha,而啟動(dòng)hub我們指定了--name屬性,hub容器的name為我們指定的selenium-hub
  由于我們是在后臺(tái)啟動(dòng)這2個(gè)鏡像文件的,我們想要看容器啟動(dòng)的log怎么辦,以selenium_hub為例子,我們輸入docker logs selenium_hub有如下信息:

  這些信息與我們?cè)诒镜豍C機(jī)上使用selenium-server-standalone-×××.jar無(wú)異。同理我們可以用docker logs sleepy_bhabha查看node的啟動(dòng)信息。
  做完這一切我們?cè)跒g覽器中輸入http://192.168.99.100:5555/grid/console,有如下信息:

  可以看出來(lái),我們的hub中有個(gè)新注冊(cè)的裝有firefox瀏覽器且版本號(hào)為50.0的node節(jié)點(diǎn),我們本地寫(xiě)個(gè)簡(jiǎn)單的腳本來(lái)測(cè)試下這個(gè)簡(jiǎn)單的grid布局代碼如下:
  #coding=utf-8
  from  selenium import webdriver
  firefox_capabilities ={
  "browserName": "firefox",
  "version": "50.0",#注意版本號(hào)一定要寫(xiě)對(duì)
  "platform": "ANY",
  "javascriptEnabled": True,
  "marionette": True,
  }
  browser=webdriver.Remote("http://192.168.99.100:5555/wd/hub",desired_capabilities=firefox_capabilities)#注意端口號(hào)5555是我們上文中映射的宿主機(jī)端口號(hào)
  browser.get("http://www.baidu.com")
  browser.get_screenshot_as_file("D:/baidu.png")
  browser.close()
  代碼比較簡(jiǎn)單,是打開(kāi)node端的firefox瀏覽器,輸入百度后截圖,一切看起來(lái)都是那么順利,但是細(xì)心的同事可能發(fā)現(xiàn)至少有以前2個(gè)問(wèn)題:
  第一、我們對(duì)百度的截圖中文是亂碼的,這個(gè)不能忍啊!!!
  第二、我們?cè)俅卧贗DE運(yùn)行下這個(gè)腳本,發(fā)現(xiàn)一直處于阻塞狀態(tài)也不報(bào)錯(cuò),得不到hub遠(yuǎn)程的執(zhí)行信息~~
  對(duì)于問(wèn)題一,因?yàn)槲覀円婕暗疥P(guān)于docker的鏡像制作等操作我們放在后面介紹,先來(lái)看看第二個(gè)問(wèn)題,為什么我們?cè)俅芜\(yùn)行這個(gè)腳本無(wú)法正常執(zhí)行?
  首先,這是和docker無(wú)關(guān)的,你在真實(shí)的PC機(jī)上也是同樣的結(jié)果!既然和docker無(wú)關(guān)那是selenium-server-standalone-3.3.1.jar這個(gè)包的bug了?答案是:也不是!那到底是什么我們來(lái)看看是什么原因。我們打開(kāi)hub的log(docker logs selenium_hub)。截圖如下:

  看出來(lái),第一次我們得到了一個(gè)包含有Capabilties請(qǐng)求的request后成功的建立了一個(gè)session,這個(gè)對(duì)應(yīng)于我們第一次在IDE運(yùn)行上文的腳本;我們第二次再次運(yùn)行這個(gè)腳本,雖然hub得到了這個(gè)請(qǐng)求,但是沒(méi)有成功的建立了一個(gè)新的session。那么問(wèn)題可能出在node端它不容許建立新的session,所以我們一直處于阻塞狀態(tài)(阻塞的時(shí)間由node的啟動(dòng)參數(shù)newSessionWaitTimeout決定),除非我們的第一個(gè)session被人為的或者由于超時(shí)被自動(dòng)切斷后,才能重新建立!
  問(wèn)題知道了,我們?nèi)绾胃倪M(jìn)呢?對(duì)的是改變node的啟動(dòng)參數(shù)。我們seleniu/node鏡像默認(rèn)的關(guān)鍵參數(shù)如下:
  "capabilities": [
  {
  "maxInstances": $NODE_MAX_INSTANCES,#大的瀏覽器實(shí)例
  ......
  }
  "maxSession": $NODE_MAX_SESSION #大的Session數(shù)目

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd