【Nightwatch.js】jenkinsから起動する ※firefox

【Nightwatch.js】jenkinsから起動する ※firefox

jenkinsから起動する

jenkinsでnightwatchによる打鍵を定期実行したい。
chromeを使用したnightwatchはそのままでも上手く動作するけど、firefoxは全然上手くいかなかった。
がしかし、二つの設定でfirefoxでもnightwatchを動作させることが出来たので記す。

ちなみにstackOverFlowの解決策にあるような、
「headlessモードで動かせば解決するよ!」は真っ赤な嘘です。

・firefox.profile not found
・socket hang up
と出てJenkinsが動かない問題は解決します。

Jenkins Job

カスタムワークスペースにtestケースがあるディレクトリを指定し、
Node.jsが入っていればbatコマンド叩くことで動きます。

Jenkins setting

Jenkinsの実行ユーザを変更する

問題

windowsの場合、
Jenkinsをmsiからインストールした場合でも、tomcat上でwarを使用して動かした場合でも
デフォルトの状態では実行ユーザーは「authority\system」というユーザになっています。

自分でコマンドプロンプトからnightwatchを実行する時と同じように、「whoami」と入力してみてください。
自分がPCにログインした時のユーザで実行していると思います。

C:\Users\hoge>whoami
desktop-puge6oe\hogeUser

C:\Users\hoge>

一方で、Jenkinsのジョブでbatコマンドから「whoami」を実行させてみてください。
Jenkinsのコンソール出力に「authority\system」が表示されるはずです。

以上のことより、自分でnightwatchのコマンドを叩く場合と、Jenkinsによって実行してもらう場合とでは
ユーザが異なるため上手く実行されません。(firefoxのprofileが読み込めない)

対処

windowsのサービスを開き、
jenkinsをmsiを使用してインストールした方は「Jenkins」を、
jenkinsをtomcatを使用してwarから起動している方は「Apatch Tomcat」を、
右クリック→プロパティでプロパティ画面を開きます。

「ログオン」タブを選択して移動し、
ログオンの「ローカルシステムアカウント」についているラジオボタンを「アカウント」に変更します。

アカウント名は、先ほど自分でコマンドプロンプトから実行した「whoami」で表示されたユーザ名を使用します。
「確認」を押下して表示された「ユーザの選択」画面の「選択するオブジェクト名を入力してください」の枠に入力し、
「名前の解決」で正確なユーザ名を表示させてOKを押します。
パスワードは普段PCにログインしているときのパスワードになります。

「適用」を押下し、パスワードの認証に成功したら再起動を促されるので、
サービス画面に戻って「サービスの再起動」を行います。

ちなみに、アカウントを変更して再起動をした場合、Jenkinsのユーザ作成も最初からになります。
(そのアカウントに紐づくJenkins設定を行うので)
もう一度「ローカルシステムアカウント」に戻すと前の設定の状態に戻ります。

「アカウント」で設定されたJenkins情報

C:\Users\USERNAME\.jenkins

「ローカルシステムアカウント」で設定されたJenkins情報

C:\Windows\System32\config\systemprofile\.jenkins

Jenkinsで再度「whoami」と実行させてみてください。実行ユーザが変更されているはずです。

解決すること

profileが読み込めずエラーとなることが解決します。

※日本語が文字化けしていますが、問題はないです。

ユーザーadminが実行
ビルドします。 ワークスペース: C:\nightwatch\nightwatch_windows_firefox
[nightwatch_windows_firefox] $ cmd /c call C:\opt\jenkins\temp\jenkins3321322892247792250.bat

C:\nightwatch\nightwatch_windows_firefox>node nightwatch 

[Google] Test Suite
===================
   Response 500 POST /wd/hub/session (201ms)
   { state: 'unknown error',
     sessionId: null,
     value:
      { systemInformation:
         'System info: host: \'DESKTOP-JIOS6OE\', ip: \'192.168.1.9\', os.name: \'Windows 10\', os.arch: \'amd64\', os.version: \'10.0\', java.version: \'1.8.0_181\'',
        screen: null,
        message:
         'Firefox profile \'nightwatch\' named in system property \'webdriver.firefox.profile\' not found',
        error:
         [ 'Build info: version: \'3.4.0\', revision: \'unknown\', time: \'unknown\'',
           'System info: host: \'DESKTOP-JIOS6OE\', ip: \'192.168.1.9\', os.name: \'Windows 10\', os.arch: \'amd64\', os.version: \'10.0\', java.version: \'1.8.0_181\'',
           'Driver info: driver.version: FirefoxDriver' ] },
     status: 13 }
   An error occurred while retrieving a new session: "Firefox profile 'nightwatch' named in system property 'webdriver.firefox.profile' not found"
       at endReadableNT (_stream_readable.js:1103:12)
       at process._tickCallback (internal/process/next_tick.js:63:19)
_________________________________________________

TEST FAILURE: 1 error during execution 0 tests failed, 0 passed. 1.596s

 テ� google

  An error occurred while retrieving a new session: "Firefox profile 'nightwatch' named in system property 'webdriver.firefox.profile' not found"
       at endReadableNT (_stream_readable.js:1103:12)
       at process._tickCallback (internal/process/next_tick.js:63:19)

   SKIPPED:
   - Demo test Google


C:\nightwatch\nightwatch_windows_firefox>exit 5 
Build step 'Windowsバッチコマンドの実行' marked build as failure
Finished: FAILURE

firefox setting

socket hang up問題

こっちが結構難問でした。
nightwatchというよりfirefoxの問題でした。

問題

コマンドプロンプトから手動実行だと正常にブラウザの自動打鍵がされるのに、
Jenkinsから実行しようとすると「socket hang up」エラーとなる。

対処

「security.sandbox.content.level」をデフォルトの3から4に変更する。
この設定で、firefoxの実行できる動作が制限されているようです。

nightwatchで使用するprofileでブラウザを起動し、
URL入力個所に「about:config」と入力して「→」を押します。
すると、firefoxについての触っちゃいけないような設定がずらっと並んでいるところに移動します。
検索窓に「security.sandbox.content.level」と入力すると、フィルターが掛けられて該当の設定が表示されます。
初期設定値として「3」となっています。

ダブルクリックして値を「4」に変更します。

ブラウザを閉じます。

解決すること

nightwatch実行時の「socket hang up」が解決します。

ユーザーadminが実行
ビルドします。 ワークスペース: C:\nightwatch\nightwatch_windows_firefox
[nightwatch_windows_firefox] $ cmd /c call C:\opt\jenkins\temp\jenkins5634969097704804633.bat

C:\nightwatch\nightwatch_windows_firefox>node nightwatch 

[Google] Test Suite
===================
Running:  Demo test Google

    POST  /wd/hub/session/b5820d37-faad-405a-b49f-746576950a4d/url - ECONNRESET
Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketCloseListener (_http_client.js:364:25)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)

FAILED: 1 errors (1m 0s / 60020ms)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
    DELETE  /wd/hub/session/b5820d37-faad-405a-b49f-746576950a4d - ECONNRESET
Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketCloseListener (_http_client.js:364:25)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
    DELETE  /wd/hub/session/b5820d37-faad-405a-b49f-746576950a4d - ECONNRESET
Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketCloseListener (_http_client.js:364:25)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
    DELETE  /wd/hub/session/b5820d37-faad-405a-b49f-746576950a4d - ECONNRESET
Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketCloseListener (_http_client.js:364:25)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
    DELETE  /wd/hub/session/b5820d37-faad-405a-b49f-746576950a4d - ECONNRESET
Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at Socket.socketCloseListener (_http_client.js:364:25)
   Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)
_________________________________________________

TEST FAILURE: 1 error during execution 0 tests failed, 0 passed. 5m 8s

  Cannot read property 'status' of undefined
       at Socket.socketCloseListener (_http_client.js:364:11)


C:\nightwatch\nightwatch_windows_firefox>exit 1 
Build step 'Windowsバッチコマンドの実行' marked build as failure
Finished: FAILURE

まとめ

自分の場合はこれで無事にJenkinsからfirefoxを用いたnightwatchを実行させることが出来ました。
ノーマルとheadlessどちらも実行しましたが、どちらも上手くいきました。
ノーマルで実行した場合でもブラウザは画面上に表示されず、裏でやっているみたいです。
処理を軽くするならheadlessにした方がいいですね。

ユーザーadminが実行
ビルドします。 ワークスペース: C:\nightwatch\nightwatch_windows_firefox
[nightwatch_windows_firefox] $ cmd /c call C:\opt\tomcat\apache-tomcat-9.0.11-windows-x64\apache-tomcat-9.0.11\temp\jenkins6247224014386976112.bat

C:\nightwatch\nightwatch_windows_firefox>node nightwatch 

[Google] Test Suite
===================
Running:  Demo test Google

竏� Element <body> was visible after 68 milliseconds.
竏� Testing if the page title equals "Google"  - 12 ms.
竏� Testing if element <input[type=text]> is visible  - 40 ms.
  Warning: More than one element (2) found for <input[name=btnK]> with selector: "input[name=btnK]". Only the first one will be used.
竏� Element <input[name=btnK]> was visible after 600 milliseconds.

OK. 4 assertions passed. (3.811s)

C:\nightwatch\nightwatch_windows_firefox>exit 0 
Finished: SUCCESS

参考

Windows上のJenkinsを特定のユーザーで実行する
「security.sandbox.content.level」について公式の説明
Not able to Execute Selenium scripts using Jenkins with latest Firefox browser V59 & Gecko Driver
Not able to run Firefox with geckodriver and jenkins slave machine as windows service

nightwatch.jsカテゴリの最新記事