--- title: SideeX WebService tags: Chinese --- # SideeX WebService [SideeX WebService](https://www.npmjs.com/package/@sideex/webservice)工具提供一個網際服務介面接收與執行SideeX Recorder錄製出之測試案例,可用於公司內部自行建立測試平台,提供測試服務。本文將介紹如何啟動SideeX WebService。啟動後,將可透過以下三種方式來呼叫其網際服務: 1. [SideeX Plugin for Jenkins](https://hackmd.io/@sideex/webservice-jenkins-plugin-zh) 2. SideeX WebService Client API for [Java](https://hackmd.io/@sideex/webservice-client-java-api) | [Python](https://hackmd.io/@sideex/webservice-client-python-api) | [Node.js](https://hackmd.io/@sideex/webservice-client-nodejs-api) 3. [SideeX WebService Web API](https://hackmd.io/@sideex/webservice-web-api) ![](https://i.imgur.com/1cM7KdC.png) SideeX WebService架構圖 ## 步驟1:啟動Selenium Server 1. 下載[Selenium Server](https://www.seleniumhq.org/download/) (已測版本:3.141.59) 2. 下載[WebDriver](/@sideex/webdriver-zh#Here-are-the-browsers-currently-supported-by-SideeX),並將其放置於與`selenium-server-standalone-{version}.jar`相同目錄下 3. 開啟命令列模式並且切換路徑至`selenium-server-standalone-{version}.jar`的目錄 4. 執行`java -jar selenium-server-standalone-{version}.jar` ## 步驟2:啟動SideeX WebService 1. 開啟命令列模式並執行`npm i -g @sideex/webservice` 2. 執行`sideex-webservice --config {CONFIG_FILE_PATH}`。設定檔格式請參閱[附錄A](#附錄A---SideeX-WebService-Config-File-Format)。底下為一個簡單的設定檔範例(`serviceconfig.json`): ```json= { "webservice": { "server": { "port": 50000 }, "publicURL": { "hostname": "127.0.0.1", "port": 50000 }, "projectFolderPath": "test-project", "testProjectExpireTime": 24 } } ``` :::info 提示:SideeX WebServer與Selenium Server/Node可於[Docker上運行](#附錄C---於Docker上運行SideeX-WebService與Selenium-Server) ::: ## 步驟3 (可跳過) - 使用Postman檢查SideeX WebService是否啟動 在Postman中開啟新的分頁,選擇`GET` method,輸入`http://<webservice-publicURL-hostname>:<port>/sideex-webservice/echo`,點選`Send`. ![](https://i.imgur.com/EHc23ny.png) ## 步驟4:準備測試案例檔案 準備測試案例檔案並將其打包成一個zip檔,此zip檔須包含一個`config.json`(請參閱[附錄B](#附錄B---SideeX-WebService-Client-Config-File-Format))與一個`suites`目錄,而`variables`目錄與`i18n`目錄為選擇性項目,此zip檔內結構如下 ```= testcase.zip │ config.json ├───suites │ Test_Suite_1.html │ ... ├───variables │ Global_Variables.json │ ... ├───i18n ja.json zh_TW.json ... ``` ## 步驟5 (可跳過) - 使用Postman檢查SideeX WebService是否能正常執行測試案例 1. 在Postman中開啟新的分頁,選擇`POST` method,輸入`http://<webservice-publicURL-hostname>:<port>/sideex-webservice/runTestSuites`. 2. 選擇`Body` -> `form-data`,在`Key`欄位輸入`file`,在`Value`欄位點選`Choose Files`加入`testcase.zip`,點選`Send`. ![](https://i.imgur.com/DuOpaVv.png) ## 步驟6:呼叫SideeX WebService以執行測試案例 可透過底下三種方式來呼叫SideeX WebService以執行步驟3準備之zip檔: 1. [SideeX Plugin for Jenkins](https://hackmd.io/@sideex/webservice-jenkins-plugin-zh) 2. SideeX WebService Client API for [Java](https://hackmd.io/@sideex/webservice-client-java-api) | [Python](https://hackmd.io/@sideex/webservice-client-python-api) | [Node.js](https://hackmd.io/@sideex/webservice-client-nodejs-api) 3. [SideeX WebService Web API](https://hackmd.io/@sideex/webservice-web-api) # 附錄A - SideeX WebService Config File Format 此附錄將說明SideeX WebService Server設定檔格式(`serviceconfig.json`)。 ```json= { "webservice": { "server": { "port": 50000, "ssl": { "active": true, "privateKey": "your_private_key", "certificate": "your_certificate" } }, "publicURL": { "hostname": "127.0.0.1", "port": 50000 }, "testJobsFolderPath": "test-jobs", "testJobExpireTime": 24 }, "mail": { "active":2, "configs": { "transport": { "host": "smtp.gmail.com", "port": 465, "secure": true, "auth": { "user": "your_email@gmail.com", "pass": "your_app_password" } }, "mailer": { "from": "\"SideeX WebService\" <xxxxx@gmail.com>", "to": "xxxxx@gmail.com, xxxxx@gmail.com", "subject": "The test reports generated by SideeX Runner", "html": "<p> Type your email body here</p>" } } }, "slack": { "active": 2, "configs": { "token": "your_slack_token", "channel": "your_channel", "text": "Here comes the test reports generated by SideeX WebService" } }, "line": { "active": 2, "configs": { "token": "your_line_notify_token", "text": "Here comes the test reports generated by SideeX WebService" } } } ``` Description * **webservice** * server * port * Description: 設定Server Port * Value: A number * Default: `50000` * ssl * active * Description: 設定是否啟用SSL連線 * Value: boolean * Default: `false` * privateKey * Description: 設定Private Key檔案路徑。可參閱[如何利用OpenSSL建立Private Key和Certificate](https://hackmd.io/@sideex/ssl-zh) * Value: A string * Default: `""` * certificate * Description: 設定Certificate檔案路徑。可參閱[如何利用OpenSSL建立Private Key和Certificate](https://hackmd.io/@sideex/ssl-zh) * Value: A string * Default: `""` * publicURL * hostname * Description: * SideeX WebService Server的IP位址 * 若SideeX WebService Server運行於一個Docker Container中,此屬性須設定為Host的IP位址 * Value: A string * Default: `"127.0.0.1"` * port * Description: * SideeX WebService Server的Port值 * 若SideeX WebService Server運行於一個Docker Container中,此屬性須設定為對應到此Container於Host上的Port * Value: A number * Default: `50000` * testJobsFolderPath * Description: - 一個目錄名稱,用以存放測試執行期間產生之暫存檔案 - Value: A string - Default: `"test-project"` * testProjectExpireTime :::info 此屬性可被測試案例zip檔中之`config.json`覆寫 ::: * Description: - 暫存檔案之到期清除時間 - `0` : 永不清除 - `n` : 每次收到測試案例zip檔案並執行測試,於`n`小時後將清除暫存檔案 - Value: A positive integer (單位:小時) - Default: `0` - **mail** 將測試報告以Email寄出。注意:若使用Gmail SMTP伺服器寄信時,須事先建立[Application Password](https://support.google.com/mail/answer/185833?hl=zh-Hant) :::info 以下屬性可被測試案例zip檔中之`config.json`覆寫 ::: - **active** - Description - `0` : 不寄送信件 - `1` : 當測試失敗時才寄送信件 - `2` : 不論測試結果一律寄送信件 - Value: `0`, `1` or `2` - Default: `0` - **configs** - **transport** - Description: Mail伺服器設定。可參考[SMTP Transport](https://nodemailer.com/smtp/) - Value: 如以下格式 ``` { "host": "smtp.gmail.com", "port": 465, "secure": true, "auth": { "user": "xxxx@gmail.com", "pass": "your_password" } } ``` `user` 的欄位請填入您的 gmail 帳號,`pass` 的欄位請根據[這篇](https://support.google.com/accounts/answer/185833)文章產生出一組給郵件的應用程式密碼。 - Default: `undefined` - **mailer** - Description: 信件設定。可參考[Message](https://nodemailer.com/message/) - Value: 如以下格式 ``` { "from": "\"your_title\" <xxxx@gmail.com>", "to": "xxxx1@gmail.com, xxxx2@gmail.com", "subject": "The test reports generated by SideeX Runner", "html": "<p>Type your own mail body here</p>" } ``` - Default: `undefined` - **slack** 推送測試報告至Slack。事先須準備[Slack Token與Channel](/@sideex/slack-zh) :::info 以下屬性可被測試案例zip檔中之`config.json`覆寫 ::: - **active** - Description - `0` : 不推送至Slack - `1` : 當測試失敗時才推送至Slack - `2` : 不論測試結果一律推送至Slack - Value: `0`, `1` or `2` - Default: `0` - **configs** - **token** - Description: Slack APP之Token - Value: A string - Default: `""` - **channel** - Description: Slack Workspace Channels - Value: A string - Default: `""` - **text** - Description: 推送文字訊息。將顯示於Test Report Summary前 - Value: A string - Default: `""` - **line** 推送測試報告至Line。事先須準備[Line Notify Token](https://hackmd.io/@sideex/line-notify-zh) :::info 以下屬性可被測試案例zip檔中之`config.json`覆寫 ::: - **active** - Description - `0` : 不推送至Line - `1` : 當測試失敗時才推送至Line - `2` : 不論測試結果一律推送至Line - Value: `0`, `1` or `2` - Default: `2` - **configs** - **token** - Description: Line Notify Token - Value: A string - Default: `""` - **text** - Description: 推送文字訊息。將顯示於Test Report Summary前 - Value: A string - Default: `""` # 附錄B - SideeX WebService Client Config File Format 此附錄將說明測試案例zip檔中之設定檔格式(`config.json`)。此設定檔格式內容除了以下屬性有差異外,其餘屬性與[SideeX Runner設定檔格式](https://hackmd.io/@sideex/runner-zh)相同: * `input`、`report.path`、`webdriver.i18n`屬性無作用 * 多了一項屬性:`testProjectExpireTime`。此屬性若有設定值,則將覆蓋SideeX WebService Server設定檔之同名屬性。 格式如下: ```json= { "play": { "mode": 2, "entry": "", "noLog": false, "speed": 5, "autoWaitTimeout":30, "period": { "time": -1, "maxNum": -1 } }, "report": { "type":"html", "snapshot": 2, "snapshotQuality": 2 }, "webdriver": { "configs": [ { "serverUrl": "http://localhost:4444", "type": "selenium", "browsers":[ { "active": true, "capability": { "browserName": "chrome", "goog:chromeOptions": { "args": [ "headless", "disable-gpu", "window-size=1080,720", "no-sandbox" ] } } }, { "active": true, "capability": { "browserName": "firefox", "moz:firefoxOptions": { "args": [ "-headless", "-disable-gpu", "-window-size=1080,720" ] } } } ] } ] }, "webservice": { "testJobExpireTime": 24 }, "mail": { "active": 2, "configs": { "mailer": { "from": "\"your_title\" <xxxx@gmail.com>", "to": "xxxx1@gmail.com, xxxx2@gmail.com", "subject": "The test reports generated by SideeX Runner", "html": "<p>Type your own mail body here</p>" } } }, "slack": { "active": 2, "configs": { "token": "your_slack_token", "channel": "your_channel", "text": "Here comes the test reports generated by SideeX Runner" } }, "line": { "active": 2, "configs": { "token": "your_line_notify_token" "text": "Here comes the test reports generated by SideeX WebService" } } } ``` # 附錄C - 於Docker上運行SideeX WebService與Selenium Server 此附錄將介紹如何於同一台電腦上運行SideeX WebService container與Selenium Server/Hub containers。 ## 步驟1:下載與運行Selenium Hub/Node Docker影像檔 在一台主機(底下簡稱Host)上開啟命令列並執行下列指令: ```= $ docker run -d -p 4444:4444 --name selenium-hub selenium/hub $ docker run -d -P -p 5900:5900 --link selenium-hub:hub -v /dev/shm:/dev/shm selenium/node-chrome-debug $ docker run -d -P -p 5901:5900 --link selenium-hub:hub -v /dev/shm:/dev/shm selenium/node-firefox-debug ``` > 更多資訊請參閱[Docker images for the Selenium Grid Server](https://github.com/SeleniumHQ/docker-selenium) ## 步驟2:下載與運行SideeX WebService Docker影像檔 1. 建立一個`serviceconfig.json`檔案(請參閱[附錄A](#附錄A---SideeX-WebService-Config-File-Format)) 2. 建立一個`test-jobs`目錄。此目錄將與SideeX WebService container共用,用以暫存執行測試時所產生的檔案 3. 執行以下指令以下載與執行SideeX WebService Docker影像檔 ```= $ docker run -d -P -p 50000:50000 \ --link selenium-hub:hub \ -v $(pwd)/serviceconfig.json:/opt/sideex-webservice/serviceconfig.json \ -v $(pwd)/test-jobs:/opt/sideex-webservice/test-jobs \ sideex/webservice ``` 4. 在使用端測試案例zip檔中的設定檔內容,將`webdriver.configs.serverUrl`屬性設定如下: ```json= { "webdriver": { "configs": [ { "serverUrl": "http://{Host主機的IP}:{對應到Selenium hub container於Host主機上的Port} 或 http://<selenium-hub-container-name>:{對應到Selenium hub container於Host主機上的Port}", "type": "selenium", "browsers":[ { "active": true, "capability": { "browserName": "chrome" } } ] } ] } } ``` ## 步驟3:監看SideeX WebService Container 執行以下指令以監看SideeX WebService執行時之Log: ```= $ docker logs -f <SideeX-WebService-container-name> ```