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

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

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

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

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

  這些信息與我們在本地PC機上使用selenium-server-standalone-×××.jar無異。同理我們可以用docker logs sleepy_bhabha查看node的啟動信息。
  做完這一切我們在瀏覽器中輸入http://192.168.99.100:5555/grid/console,有如下信息:

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

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

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