Seleniumをプロキシ環境で実行する際に考慮した方がよさげなこと

【背景】
 私が現在利用している開発環境はAWS上に存在する。一方クライアント端末(Windowsのみ)は社内に存在している。自身の会社には社内プロキシが存在するため、HTTP通信は社内プロキシを通さないと通信を抜けさせてくれない。SSHでトンネリングさせる方法も最悪使えなくもないが、その場合通常の通信とは経路が若干異なるため出来るだけ通常の通信と同じ方法で接続させたいのと、社内法規上一応アウトなので素直にプロキシを通した通信にてSelenium実行をしている(SSHを許可してくれる時点でなんでもありな気はするが…)。
 プロキシを通す事によりうまくいかなかった事が色々あったので、覚えている範囲でさらしておきます(社内プロキシ関係ない部分も記載有り)。

【設定内容】
[Java]
Javaコントロールパネルの設定確認($JAVA_HOME/bin/javacpl.exe)
・[一般] - [ネットワーク設定] → プロキシ設定が想定通りかの確認
・[セキュリティ] - [例外サイトリスト] → セキュリティプロンプトを出さない様に設定

●(プロキシは直接関係ないが)Basic認証の設定($JAVA_HOME/lib/net.properties)
 jdk.http.auth.tunneling.disabledSchemesをコメントアウト

[Jenkins]
●[ノード] - [ノード名] - [起動方法] - [トンネル接続] - localhost:8080 とかに設定
●[グローバルセキュリティの設定] - [Agents] - [TCP port for JNLP agents] → 8080とかに固定化

[IE]
●[ツール] - [インターネットオプション] - [プロキシの設定] → プロキシの設定
 (Windows7の場合は)システムの設定や利用しているソフトが知らぬ間に内部的に参照している場合もあるため、IE使ってなくても対応必要有
 Windows10に関しては、現時点では知見無

[プロキシ]
Proxomitron, MAPEなどを利用
 FireFoxのプロキシポップアップを回避するために利用(∵FireFoxのプロキシがパスワードを記憶してくれないため)
 また、直接接続するより、プロキシソフトを利用して接続した方がログが見れたり、通信レベルでリトライしてくれたり、設定が実は効いてなかったり(主にeclipse)などを吸収できるので便利

[SSH転送]
●RLogin, TeraTermなどを利用
 masterとslabeの接続を維持するために必要
 (こちらはテスト処理とは関係ない部分なので許容)

[その他]
●各環境の環境変数
 http_proxyなどの設定があると、思わぬ挙動をする場合がある
 (ex. http_proxyを設定していると、ローカルアドレスの場合でも必ず当環境変数を参照してしまう。MAPEの設定を触っている際に当事象が発生していた。)


【参考リンク】
兵庫県電子入札共同運営システム:HTTPS トンネリングの Basic 認証無効化への対処
https://www.nyusatsu.e-hyogo.jp/hyogo/files/https_tunneling.pdf


[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

エキスパートが教えるSelenium最前線 (CodeZine Digital First)

エキスパートが教えるSelenium最前線 (CodeZine Digital First)

Selenium × Geb の組み合わせ for FireFox ESR60

現在自身が動かしている環境の設定に関して公開しておきます。
あくまでも一例であり、最適解とは思っていませんが、一応動いてはいますので何かの足しになれば幸いです。

[環境情報]
(ホスト)
CentOS7
(クライアント)
Windows7
FireFox ESR60
geckodriver v0.20.1

[build.gradle]

(中略)
dependencies {
    //Groovy
    testCompile 'org.codehaus.groovy:groovy-all:2.4.13'

    //Spock
    testCompile group: 'junit', name:'junit', version: '4.+'
    testCompile "org.spckframework:spock-core:1.1-groovy-2.4'
    testCompile 'net.bytebuddy:byte-buddy:1.6.5'
    testCompile 'org.objensis:objensis:2.5.1'

    //Geb
    def gebVer = "2.1"
    testCompile "org.gebish:geb-core:${gebVer}"
    testCompile "org.gebish:geb-spock:${gebVer}"

    //Selenium-driver
    def seleniumVer = "3.12.0"
    testCompile "org.seleniumhq.selenium:selenium-java:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-support:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-ie-driver:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-edge-driver:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVer}"
    testCompile "org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVer}"
(以下、略)

[GebConfig.groovy]

import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxOptions
(中略)
System.setProperty("brt", "FireFox")
System.setProperty("webdriver.gecko.driver", "geckodriver.exe")

FirefoxOptions options = new FirefoxOptions()
options.addPreference("browser.download.folderList", 2)  //ダウンロードに指定された最後のフォルダ
options.addPreference("browser.download.dir", /${fileDownloadDir}/) //ダウンロードフォルダの指定
options.addPreference("browser.download.manager.showhenStarting", false) //ダウンロードダイアログを非表示
options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream, image/png, application/vnd.ms-excel, test/plain, application/vnd.ms-excel.sheet.macroEnabled.12")//指定したMIMEタイプは強制保存
driver = new FirefoxDriver(options)
(以下略)

[FireFox ESR38→FireFox ESR60に乗り換える際にはまったこと]
FireFoxは今までドライバが内蔵されていたので、クライアント側に配置する必要がなかった。そのため、各開発者にはFirefoxをインストールするだけで良かったが、ESR45位からはドライバも配置してもらう必要があった。そこをハンドリングし忘れていたため、テスト環境では動くが各開発者の環境では動かないという事象を発生させてしまった。
・import文の宣言を忘れていたので、実行してもFireFoxOptionsが有効でないという怒られ方をしていたがなかなか気づけなかった。(長い間スタックトレースの詳細版に記述されていた unable to resolve class FirefoxOptions というエラーに気づかずに、Jenkinsのサマリー側に表示されていた MultipleCompilationErrorsException のエラーについて追ってしまい、無駄に時間をかけてしまった)
・FireFoxProfileも併存して書いてしまっていた(上記がimport文問題が最後まで気づけず、なかなか気づけなかった)

[参考URL]
github.com
selenium/FirefoxOptions.java at master · SeleniumHQ/selenium · GitHub
selenium/CapabilityType.java at master · SeleniumHQ/selenium · GitHub

エキスパートが教えるSelenium最前線

エキスパートが教えるSelenium最前線

(内容は簡単だけど、情報をアップデートするという意味ではそんなに高い本ではないので、最低立ち読み、買ってぱら見位では読んでおいた方がいいかもです)

P55 Dockerレジストリ―

[docker Hub]
・パグリックリポジトリとプライベートリポジトリがある
・プライベートリポジトリは無償では一つのみ作成可能である

[プライベートレジストリ]
レジストリ用のサーバーを自分で用意して、そちらで管理する
CentOSなどではRPMが用意されている
・設定は以下ファイルの修正が必要である。(See.P58)
 /etc/sysconfig/docker-registry
 /etc/docker-registry.yaml
 /etc/sysconfig/docker

ビューは既に存在していますというエラーが発生してジョブが作成できない

[事象]
Jenkinsでビューを作成しようとしたが、他のビューのパラメータを確認したかったので、一度作業を中断した。
その後、ビューを作成しようとすると、「<ビュー名>というビューは既に存在しています。」(というメッセージが表示され、ビューの作成が行えない。
ビューを削除しようにも、そのビューにコンソール上から辿れそうにないため、削除が行えない。←ビュー一覧表示がどこかにある?

[対応方法]
以下のURLにアクセスすると、該当ビューを削除するかどうか聞かれる画面に遷移するので、そこでOKとすれば削除可能

http://<Jenkinsのドメイン名>/view/<ビュー名>/delete

[参考URL]
[Jenkins] ".."という名前のビューを削除する方法 hudson cloudbees | CODE Q&A [日本語]

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

P144 開発モードと本番モード

開発モードでは、重複した変更検知サイクルのチェックなど、開発の補助を目的とした様々なチェックを実施している。
本館環境へ移行する際には、本番モードを有効にしておくこと。
本番モードを有効にするには、main.tsに対して以下のコードを追加するだけでよい。

import { enableProdMode  } from '@angular/core';
(中略)
enableProdMode();
platformBrowserDynamic().bootstrapModule(AppModule);

Angularアプリケーションプログラミング

Angularアプリケーションプログラミング

P90 パイプ

【役割】
テンプレート上に埋め込まれたデータを加工/整形するための仕組み

【構文】

{{exp | pipe [:param1 ...]}}

(例)

{{price | currency:'JPY'}}

Angular標準パイプには、lowercaseやsliceなどがあり、P91にまとめられている。

Angularアプリケーションプログラミング

Angularアプリケーションプログラミング

P79 テンプレート参照変数

【意味】
テンプレート内の特定の要素を参照するための変数

【構文】

<element #variable />

element:任意の要素
variable:変数の名前

(例1)

<input #txt id="txt" name="txt" type="text" (input)="show(txt.value)" />

(例2)

<label>姓:<input #last type="text" (change)="0" /></label><br />
<label>名:<input #first type="text" (change)="0" /></label>
<div>こんばんわ、{{(last.value)}} {{firstvalue}}さん。</div>

テンプレート参照変数はテンプレート内であれば任意の場所で参照可能である。
なお、(change)="0"を書かないと上記コードはうまく動かない。
これは、Angularに「データバインディングをし直してほ」と伝達する役割を果たす。
なお、数値の0でなくてもよいが、当記法が一般的である。

Angularアプリケーションプログラミング

Angularアプリケーションプログラミング