今回はタイトル通りJavaでEdgeドライバーを操作、Edgeから値を取得を行います。
この方法を理解できれば、Chromeも同様のことができると思います。
以下がEdgeを操作してSECUREMATRIXのパスワードを取得しております。
目次
下準備
この記事はSECUREMATRIX(セキュアマトリクス)の自動ログインを行うために記載しております。
自動ログインプログラムを作成しない方は読み飛ばしてください。
以下の3つのクラスを作成します。
作成したプロジェクト>src/main/java>作成されたパッケージを左クリック
新規→クラスをクリック
名前にLoginと入力して完了を押下
この操作を繰り返してLogin.java,SmxLogin.java,VmLogin.javaを作成する
空白の部分で左クリック→新規→ファイルをクリック
作成したプロジェクトを選択
ファイル名をlogin.propertiesと入力
完了を押下
以上が下準備になります。
login.propertiesのソースコード及び解説
propertiesファイルは主にJavaのソースコードに記載したくないものを記載します。
記載したくないものとは主に機密情報や変更を予定されているものがあります。
javaファイルを変更するとその後コンパイルやjarファイルの再作成など面倒なことが増えます。
それをpropertiesファイルとして毎回読み込むようにすればpropertiesファイルのみの変更で済みます
そのため、今回は変更が定期的にされるパスワードをpropertiesに記載しました。
smxPassword=a1 b1 c1 d1 e1 f1 g1 h1
vmPassword=VMwareのパスワードを入力してください
一行目にSECUREMATRIXのパスワードの位置、
二行目にVMwareのパスワードを記載します。
一行目に関しては以下で詳細を記載します。
SECUREMATRIXのパスワードの位置の解説
このルールは私が決めたものなので参考程度に見てください。
abcd efgh ijkl mnop
-------------------
1|1234 5678 9012 3456
2|7890 1234 5678 9012
3|3456 7890 1234 5678
4|9012 3456 7890 1234
SECUREMATRIXでは上記のような4×16でパスワードが出力されると思います。
そこで行を1,2,3,4と列をa~pで表します。
abcd efgh ijkl mnop
-------------------
1|1234 5678
2|
3|
4|
パスワードが上記の場合、 smxPasswordを「a1 b1 c1 d1 e1 f1 g1 h1」とします。
abcd efgh ijkl mnop
-------------------
1| 34
2| 2 7
3|1 6
4|8 5
パスワードが上記の場合、 smxPasswordを「a3 b2 c1 d1 e4 i3 m2 a4」とします。
Login.javaのソースコード及び解説
package smxVmLoginSample.smxVmLoginSample;
/**
* Login
*
*/
public class Login
{
public static void main(String[] args ){
try {
// SecureMatrixにLogin
String pw = new SmxLogin().smxLogin();
// VMにLogin
//new VmLogin().vmLogin(pw);
} catch (Exception e) {
e.printStackTrace();
}
}
}
このLoginクラスは一番最初に呼び出されるクラスとして作成しました。
このクラスからSECUREMATRIX(セキュアマトリクス)のパスワード自動取得や
VMware自動ログインクラスを呼び出します。
VMware自動ログインはこの記事ではまだ作成しない為、コメントアウトしております。
よくわからない方はコピペしてパッケージ名等を自身のものに合わせてください。
SmxLogin.javaのソースコード及び解説
package smxVmLoginSample.smxVmLoginSample;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;
/**
* SecureMatrixLogin
*
*/
public class SmxLogin{
// VMのパスワード
private final String smxPw;
// コンストラクタ
public SmxLogin() throws IOException{
// VMのパスワード取得
FileInputStream fis = new FileInputStream("/*login.properiesまでのディレクトリを記載してください*/");
Properties properties = new Properties();
properties.load(fis);
smxPw = properties.getProperty("smxPassword");
}
public String smxLogin() throws InterruptedException{
// driverの設定
System.setProperty("webdriver.edge.driver", "/*ダウンロードしたEdgeドライバーmsedgedriver.exeのディレクトリを記載してください。*/");
// インスタンス生成
EdgeDriver ed = new EdgeDriver();
// urlへアクセス
ed.get("/*自身の会社のSECUREMATRIXのURLを記載してください*/");
// 入力
ed.findElement(By.xpath("/*要素のパス*/")).sendKeys("/*ログインIDを記載してください*/");
// トークン表示をクリック
ed.findElement(By.xpath("/*要素のパス*/")).click();
// 5秒待機
Thread.sleep(5000);
StringBuilder sb = new StringBuilder();
Arrays.stream(getSmxPw().split(" ")).forEach(str -> sb.append(getSmxNo(ed, str)));
// クローズ
ed.close();
// パスワードを返す
return sb.toString();
}
private String getSmxNo(EdgeDriver ed, String str){
char[] matrix = str.toCharArray();
char matrix1;
char matrix2= matrix[1];
char matrix3;
switch(matrix[0]) {
case 'a':
matrix1 = '0';
matrix3 = '1';
break;
case 'b':
matrix1 = '0';
matrix3 = '2';
break;
case 'c':
matrix1 = '0';
matrix3 = '3';
break;
case 'd':
matrix1 = '0';
matrix3 = '4';
break;
case 'e':
matrix1 = '1';
matrix3 = '1';
break;
case 'f':
matrix1 = '1';
matrix3 = '2';
break;
case 'g':
matrix1 = '1';
matrix3 = '3';
break;
case 'h':
matrix1 = '1';
matrix3 = '4';
break;
case 'i':
matrix1 = '2';
matrix3 = '1';
break;
case 'j':
matrix1 = '2';
matrix3 = '2';
break;
case 'k':
matrix1 = '2';
matrix3 = '3';
break;
case 'l':
matrix1 = '2';
matrix3 = '4';
break;
case 'm':
matrix1 = '3';
matrix3 = '1';
break;
case 'n':
matrix1 = '3';
matrix3 = '2';
break;
case 'o':
matrix1 = '3';
matrix3 = '3';
break;
case 'p':
matrix1 = '3';
matrix3 = '4';
break;
default:
throw new RuntimeException("The character out of secure matrix" + matrix[0]);
}
return ed.findElement(By.xpath("/*要素のパス*/).getAttribute("alt");
}
public String getSmxPw() {
return smxPw;
}
}
上記がソースコードになります。
読むのが面倒な方はディレクトリやログインIDだけ自身のものにして頂ければ使えるかと思います。
また、以下Edgeドライバーで使用するメソッドはスーパークラスであるRemoteWebDriverのものを使用しています。
// VMのパスワード
private final String smxPw;
// コンストラクタ
public SmxLogin() throws IOException{
// VMのパスワード取得
FileInputStream fis = new FileInputStream("/*login.properiesまでのディレクトリを記載してください*/");
Properties properties = new Properties();
properties.load(fis);
smxPw = properties.getProperty("smxPassword");
}
クラスの上部セキュアマトリクスのパスワードを他のクラスでは使用せず、変更もないと判断したためprivate finalで設定しました。
コンストラクタで login.propertiesにアクセスしデータを読み込み、SECUREMATRIXのパスワードを取得します。
// driverの設定
System.setProperty("webdriver.edge.driver", "/*ダウンロードしたEdgeドライバーmsedgedriver.exeのディレクトリを記載してください。*/");
// インスタンス生成
EdgeDriver ed = new EdgeDriver();
smxLoginメソッドでは最初にEdgeドライバーを適応します。
// urlへアクセス
ed.get("/*自身の会社のSECUREMATRIXのURLを記載してください*/");
get(url)メソッドでEdgeでサイトを開きます。
// 入力
ed.findElement(By.xpath("/*要素のパス*/")).sendKeys("/*ログインIDを記載してください*/");
// トークン表示をクリック
ed.findElement(By.xpath("/*要素のパス*/")).click();
findElementメソッドでサイトの要素を指定し、
sendKeysメソッドでログインIDを指定します。
clickメソッドは要素をクリックします。
yahooの画面で説明します。
サイトを開いた後にF12ボタンを押します。
すると画面左側にコード等が出てきます。
赤で囲ったボタンを押します。
任意の要素を指定してください。
今回は検索欄をクリックしました。
すると左側のソースの該当する要素の部分の背景色がグレーになります。
そこを左クリック→コピー→完全なXPathのコピーをクリックします。
すると以下のように要素のパスをコピーできます。
/html/body/div/div[1]/header/section[1]/div/form/fieldset/span/input
この操作を自身のSECUREMATRIXサイトで行い要素のパスを取得してください。
以下、ソースコードの解説に戻ります。
// 5秒待機
Thread.sleep(5000);
サイトが開かれるまで5秒(5000ミリ秒)待機
ここは皆様のPCのスペックや通信環境に合わせて3秒にしたり10秒にしたりしてください。
StringBuilder sb = new StringBuilder();
Arrays.stream(getSmxPw().split(" ")).forEach(str -> sb.append(getSmxNo(ed, str)));
~省略~
public String getSmxPw() {
return smxPw;
}
StringBuilderのインスタンスを生成します。
getSmxPwメソッドでパスワードを取得し、半角スペースで区切り配列にします。
その配列をストリームにし、配列の文字列をそれぞれgetSmxNoメソッドに入れ、
Edgeからパスワードを取得し、StringBuilderのインスタンスに文字列を追加します。
簡単にまとめますとここでSECUREMATRIXのパスワードを取得しております。
getSmxNoを解説します。
private String getSmxNo(EdgeDriver ed, String str){
char[] matrix = str.toCharArray();
char matrix1;
char matrix2= matrix[1];
char matrix3;
switch(matrix[0]) {
case 'a':
matrix1 = '0';
matrix3 = '1';
break;
case 'b':
matrix1 = '0';
matrix3 = '2';
break;
case 'c':
matrix1 = '0';
matrix3 = '3';
break;
case 'd':
matrix1 = '0';
matrix3 = '4';
break;
case 'e':
matrix1 = '1';
matrix3 = '1';
break;
case 'f':
matrix1 = '1';
matrix3 = '2';
break;
case 'g':
matrix1 = '1';
matrix3 = '3';
break;
case 'h':
matrix1 = '1';
matrix3 = '4';
break;
case 'i':
matrix1 = '2';
matrix3 = '1';
break;
case 'j':
matrix1 = '2';
matrix3 = '2';
break;
case 'k':
matrix1 = '2';
matrix3 = '3';
break;
case 'l':
matrix1 = '2';
matrix3 = '4';
break;
case 'm':
matrix1 = '3';
matrix3 = '1';
break;
case 'n':
matrix1 = '3';
matrix3 = '2';
break;
case 'o':
matrix1 = '3';
matrix3 = '3';
break;
case 'p':
matrix1 = '3';
matrix3 = '4';
break;
default:
throw new RuntimeException("The character out of secure matrix" + matrix[0]);
}
return ed.findElement(By.xpath("/*要素のパス*/")).getAttribute("alt");
}
ここは非常に難しいです。
自身でセキュアマトリクスの表のパスのパターンを見つけなければなりません。
セキュアマトリクスの表が表示されたら
要素のパスを左クリック→コピー→XPathのコピーで複数取得します。
前回とは異なり、完全なXPathのコピーではなくXPathのコピーを行うとパターンが見えてくると思います。
パターンが見えてくるまでひたすら取得してください。
参考までに私のパス以下のようなパターンになっておりました。
○○id○○matrix数字○○tr数字○○td数字○○
数字部分以外が固定されており、数字部分が行数と列数のパターンになっておりました。
手書きで、表なんか書いてみると見えてくるかもしれません。頑張ってください。
パターンが見えてきましたらここで定義したmatrix1,matrix2,matrix3をパスに当てはめることができると思います。
できない場合はここは自身で変えなければいけないかもしれません。
私の場合はidにmatrix1をtrにmatrix2をtdにmatrix3を使用しました。
この要素の中にaltに数字を持っていたため、
findElementで要素のパスを指定し、getAttributeでaltの値を取得しました。
ここは難しいのでよくわからない方はこの記事にコメントを残していただければ回答いたします。
// クローズ
ed.close();
// パスワードを返す
return sb.toString();
最後に生成したインスタンスを閉じて取得したパスワードをLogin.javaに返します。
以上でSECUREMATRIXからパスワードを取得するプログラムの構築が完了しました。
お疲れさまでした。