テスト内からテストを実行しているSeleniumグリッドホストを識別するにはどうすればよいですか?
-
21-09-2019 - |
質問
テストを並行してテストを実行するために、TestNGでSeleniumグリッドを使用しています。ユーザーをログインする必要がある特定のテストがあるため、テスト用にユーザーアカウントを構成しています。
テストユーザーが個別の仮想マシンで実行されているときにログインするテストが中断されないようにするように注意してきましたが、いくつかの定期的に失敗したテストを調査した後、これで十分ではないことがわかります。したがって、私はする必要があります:
テストごとに新しいユーザーを設定します(これが理想的なソリューションである可能性があると思いますが、構成/実行には時間がかかります。
複数のテストユーザーアカウントがあり、一度に1つだけが使用されるようにします。
テストを実行しているマシンのホストを識別できれば、それに応じてテストアカウントを設定できます。これを行う方法はありますか、それとも私が考えていない別の解決策がありますか?
解決 2
純粋にテスト用にいくつかの一意のユーザーアカウントを設定することで問題を解決しました。すべてが数字で終わります(たとえば:selenium.test1)。これは、Seleniumを使用して1回のタスクとして自動化するのが簡単でした。
この数値をコードに保存し、テストがログインする必要があるたびに番号が増加し、ユーザー名が作成されます。
テストが終了したときに「リリース」を検討し、その後これらのアカウントを再利用しましたが、テストのテストアカウントが十分にあることを確認する方が簡単だと判断しました。
他のヒント
「Who Am I Page」を設定することで、リモコンを識別する問題を解決しました。私のリモートWebDriver(またはSelenium)ファクトリー内で、私はそのページにアクセスし、セッションを保持するために使用するクラスに保存してログを記録します。このページは、ホスト名、IP、ブラウザの種類、バージョンを報告します。
ここで提供される別のソリューション:
https://groups.google.com/forum/#!topic/selenium-users/8enrw9jnayq
public static String[] getHostNameAndPort(String hostName, int port, SessionId session) {
String[] hostAndPort = new String[2];
String errorMsg = "Failed to acquire remote webdriver node and port info. Root cause: ";
try {
HttpHost host = new HttpHost(hostName, port);
DefaultHttpClient client = new DefaultHttpClient();
URL sessionURL = new URL("http://" + hostName + ":" + port + "/grid/api/testsession?session=" + session);
BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest("POST",
sessionURL.toExternalForm());
HttpResponse response = client.execute(host, r);
JSONObject object = extractObject(response);
URL myURL = new URL(object.getString("proxyId"));
if ((myURL.getHost() != null) && (myURL.getPort() != -1)) {
hostAndPort[0] = myURL.getHost();
hostAndPort[1] = Integer.toString(myURL.getPort());
}
} catch (Exception e) {
logger.log(Level.SEVERE, errorMsg, e);
throw new RuntimeException(errorMsg, e);
}
return hostAndPort;
}