2017-10-13 96 views
0

这个问题提到xpaths,但它确实不是特定于xpaths,并且确实涉及任何Java字符串。转储或打印变量的名称

我正在使用Java 8并有大约40个字符串(类中的公共静态最终字符串)。下面是一个例子:

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。我想验证所有的XPath所以我做了一个数组一样

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

然后验证

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

你的想法。这有效,但错误消息是 “// 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

而不是一个列表,将它们存储在一个Map 中,其中的键是变量名。 – 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调用中你必须输入两次变量名),但是从维护角度来看它好得多:显然很难使两者不同步。

另一种选择是使用反射:您的阵列将是变量的名字,然后你会使用Class#getDeclaredField以获取它Field实例得到变量的值,然后通过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。 :-)(假设其中两个从未具有相同的值)。

+1

blech yeah ;-)我认为地图是最好的方法 – Tony