顯示具有 Selenium 標籤的文章。 顯示所有文章
顯示具有 Selenium 標籤的文章。 顯示所有文章

星期二, 5月 14, 2019

New Selenium Node (Chrome / Firefox) on CentOS without GUI

  • Assume Selenium Hub listen on docker host 172.17.0.1:4444
  • docker (refer this)
  • docker-compose (refer this)
  • docker-compose.yml (updated from here)
    • version: "3"
    • services:
      • chrome:
        • image: selenium/node-chrome:3.141.59-neon
        • volumes:
          • - /dev/shm:/dev/shm
        • environment:
          • - HUB_HOST=172.17.0.1
          • - HUB_PORT=4444
          • - REMOTE_HOST=http://<Host_or_IP>:6666
          • - NODE_MAX_INSTANCES=5
        • ports:
          • - "6666:5555"
      • firefox:
        • image: selenium/node-firefox:3.141.59-neon
        • volumes:
          • - /dev/shm:/dev/shm
        • environment:
          • - HUB_HOST=172.17.0.1
          • - HUB_PORT=4444
          • - REMOTE_HOST=http://<Host_or_IP>:7777
          • - NODE_MAX_INSTANCES=5
        • ports:
          • - "7777:5555"

星期三, 4月 24, 2019

Quick Start: Selenium Grid

How can we create a Selenium Grid Environment quickly? If you have docker-compose already, just refer this, save as docker-compose.yml, and run "docker-compose up -d" to start it. That's all.

How to prove it worked? we need:
  • selenese-runner.jar download from here
  • check your docker host ip address like "ip addr | grep docker0"
  • any workable side file
If selenese-runner.jar and my.side in the current directory, start another docker container:
  • docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk java -jar selenese-runner.jar --driver remote --remote-url http://<DOCKER_HOST_IP>:4444/wd/hub --remote-browser <BROWSER> <WORKABLE.side>
<BROWSER> can be chrome or firefox.

星期五, 3月 29, 2019

selenese runner can't nesting while end loop

Consider this code snippet:
  • execute script | return 2; | i
  • while | ${i} > 0 |
    • execute script | return 3; | j
    • while | ${j} > 0 |
      • echo | i: ${i}, j: ${j} |
      • execute script | return ${j} - 1; | j
    • end | |
    • execute script | return ${i} - 1; | i
  • end | |
It works fine in Selenium IDE with output:
  • i: 2, j: 3
  • i: 2, j: 2
  • i: 2, j: 1
  • i: 1, j: 3
  • i: 1, j: 2
  • i: 1, j: 1
But selenese runner missing some output, just:
  • i: 2, j: 3
  • i: 2, j: 2
  • i: 2, j: 1
  • i: 1, j: 3
How can we avoid this inconsistent? this code snippet should be ok:
  • execute script | return 2; | i
  • do | |
    • execute script | return 3; | j
    • do | |
      • echo | i: ${i}, j: ${j} |
      • execute script | return ${j} - 1; | j
    • repeat if | ${j} > 0 |
    • execute script | return ${i} - 1; | i
  • repeat if | ${i} > 0 |
[2019/03/30]
This bug was fixed at version 3.22.0, see here.

星期四, 10月 19, 2017

Confirm your Jenkins Deploy

以我大多接觸的都是 Web Application 而言,可概分
  • 淺層-網路通暢
  • 中層-版本正確
  • 深層-功能正確
淺層在 Jenkins 有個好用的 Http Request Plugin,只要輸入任一頁的 URL,這個外掛就可以試著要求,並檢查回傳的 Http Status Code 是否在預期內,通常是 2xx 或 3xx。
最近有個特例是要檢查部署的結果,但對面並不接受 http(s) 協定,在 Linux 上的 Jenkins Slave 可以用 nc -vz <IP> <Port>。
中層的話,如果部署的 Web Application 除了服務人,也服務機器(Web API),建議就考慮增加一個供外界查詢版本的 Web API,Jenkins 可透過核對 curl <Web API> 確認部署的狀況;如果是只服務人又不想改得多,可以挑一個靜態網頁的角落放版號,用 Selenium BDD 簡單的腳本確認。
深層的話,要準備 Selenium BDD 比較複雜的腳本,錄製工具似乎有些變化,所幸直接用 Node.js 來寫也不太困難。

[2017/10/23 補充]
有些 Linux 版本上 nc 似乎相容性不是很好,可用 nmap <IP> -p<Port> | grep open 試試能否取代?

星期三, 8月 02, 2017

Node.js + Selenium + Headless Browser

接續這篇的話題,既然準備好了 System Under Test SUT,那就來自動化測試吧!這次為了遷就 Linux 可能沒有 UI,先把環境需求降到最低:
  • Linux
  • Docker (Optional)
  • Node.js
  • Internet Access
別忘了 Node.js 支援跨平台,Linux 也只代表作業系統,不是非君不嫁。正好上一篇的結果可以拿來加工再利用,要補三個東西:
  • 基於 Node.js 的測試程式-checkHello.js
  • 瀏覽器
  • selenium-webdriver (for Node.js)
checkHello.js 也是愈簡單愈好,第一版只有這樣:

const assert = require('assert');
var webdriver = require('selenium-webdriver'),
    By = webdriver.By;
var driver = new webdriver.Builder()
    .forBrowser('phantomjs')
    .build();
driver.get('http://172.17.0.2:8080');
var byH1 = By.css('h1');
var h1 = driver.findElement(byH1);
var h1Text = h1.getText();
var h1Handler = function (text) {
    assert.equal(text, "Hello World!");
}
h1Text.then(h1Handler);
driver.quit();

應該很好猜在測什麼?就是比對 <h1>Hello World!</h1> 而已。瀏覽器也先挑簡單的 PhantomJS,一是不需依賴圖形介面,一是大部份瀏覽器還要再搭配驅動程式,比較麻煩。安裝指令其實源出於,改編如下:
  • docker exec -it myNode sh
  • curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar -xj --strip-components=2 -C /usr/local/bin phantomjs-2.1.1-linux-x86_64/bin
  • exit
其中 PhantomJS 下載目錄來自這裡,/usr/local/bin 是環境變數 PATH 所指向的路徑之一。本段前後這些提到指令的部份,都是針對上一篇名為 myNode 的 docker container,如果不是,例如只在本機,可以忽略灰底的部份。至於 selenium-webdriver 安裝,指令是:
  • docker exec -it myNode npm install selenium-webdriver
萬事俱備,執行測試的指令是:
  • docker exec -it myNode node checkHello.js
順利的話,會讓人誤以為沒反應?可以故意弄錯一些東西來驗證,例如換個 IP,換個 port,關掉 Web Server,Hello World! 改個大小寫什麼的。