2017-10-13 14 views
0

この質問はxpathsに言及していますが、実際にはxpathsに特有ではなく、実際にはJava Stringsに関係します。変数の名前をダンプまたは印刷する

私はJava 8を使用しており、約40文字列(クラス内のpublic static final String)を持っています。

private static final String employeeID_x = "//input[@id = 'id']"; 
private static final String employeeName = "//input[@id = 'EmployeeName']"; 

private static final String age_x = "//div[@id = 'Employee']/div[2]/span[1]"; 

などのようないくつかのより複雑なものは、これらの40がありますがあります。例は以下の通りです。私はあなたのアイデアを得る

for (String xp: arr) { 
    List<WebElement> eles = driver.findElement(By.xpath(xp)); 
    if (eles.size() == 0) { 
     System.out.println(xp + " does not exist"); 
    } 
} 

を確認するために、その後

private static final String[] arr = {employeeID_x, employeeName_x, age_x, .....}; 

のような配列をしたように、すべてのXPathを検証したいです。これは動作しますが、エラーメッセージは "// div [@id = 'Employee']/div [2]/span [1]は存在しません。私はこれは大丈夫だと思うが、私はむしろそれが "age_xは存在しない"と言うだろう。

変数名の印刷方法がわかりません。私はクラスとgetFields()を使用しようとしましたが、動作していないようです。

private static final String[] names= {"employeeID_x", "employeeName_x", "age_x", .....}; 

をして、エントリの数を取得し、

for (int i = 0; i < arr.length; i++) { 
    String xp = arr[i]; 
    String name = names[i]; 
    List<WebElement> eles = driver.findElements(By.xpath(xp)); 
    if (eles.size() == 0) { 
     System.out.println(name + " does not exist"); 
    } 
} 

を使用しますが、あなたが見ることができるように私がしなければならない何

は、配列を複製し、このように引用符で各要素を入れていますこれは痛みになることがあります。とにかくXPから名前を取得するにはありますか?たぶん、いいえ、私はそれが各文字列の値を代用する配列を作成するときに恐れているので?

ご覧のとおり、これはxpathsに固有のものではありません。

+0

、キーが変数名である '地図<文字列、文字列>'に格納します。 – azurefrog

答えて

0

変数名の印刷方法はわかりません。あなたの現在のアレイで

、あなたない(合理*)あなたは、文字列から変数名を推測することができない限り。このライン:

private static final String[] arr = {employeeID_x, employeeName_x, age_x, .....}; 

...コピーを配列にemployeeID_xなど、。

a = b; 

abの間には継続的なリンクがありません...:その値とそれだけで、このコードのように、から来た変数の間には、進行中のリンクはありません。

あなたの並列アレイソリューションは機能しますが、理想的ではないと言われています。 Mapを使用すると、わずかに良いことがあります

private static final Map<String, String> map = new HashMap<>(); 
static { 
    map.put("employeeID_x", employeeID_x); 
    map.put("employeeName_x", "employeeName_x); 
    // ... 
} 

次にあなたの名前と値の両方を与えるマップのエントリ、ループスルー。これには何度か繰り返します(例:、各putコールでは変数名を2回タイプする必要があります)、メンテナンスの観点からははるかに優れています。

別のオプションは、リフレクションを使用することです:あなたの配列は変数の名前であろう、そしてあなたはそれのためにFieldインスタンスを取得するためにClass#getDeclaredFieldを使用して、変数の値を取得したい、そしてField#getを経由して値を取得します。例えば、あなたの配列は次のようになります。

private static final String[] arr = new String[] { "employeeID_x", "employeeName" /*, ...*/ }; 

...その後:

for (String name : names) { 
    Field f = YourClass.class.getDeclaredField(name); 
    String value = (String)f.get(null); 
    // ...test `value` here, report `name` if there's a problem 
} 

*「合理的に」 - あなたはエラーコードを持つことができ、あなたの分野の一つ一つに文字列を比較し、試合を報告する

if (theString.equals(employeeID_x)) { 
    theVariableName = "employeeID_x"; 
} else if (theString.equals(employeeName_x)) { 
    theVariableName = "employeeName_x"; 
} else if (...) { 
    // ... 

...しかし、... blech。代わりに、リストの:-)(そして、それはこれらの2つが同じ値を持っていないことを前提としています。)

+1

blechええ;-)私は地図が最善の方法だと思う – Tony

関連する問題