2017-10-13 5 views
0

Cette question mentionne xpaths mais n'est vraiment pas spécifique aux xpaths et concerne vraiment les Java Strings. J'utilise Java 8 et j'ai environ 40 Strings (public static final String dans la classe). Un exemple est ci-dessous:Décharger ou imprimer le nom d'une variable

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

et il y a d'autres plus compliquées comme

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

etc. Il y a 40 de ces derniers. Je veux vérifier tous les XPath donc je fait un tableau comme

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

puis de vérifier

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

vous voyez l'idée. Cela fonctionne, mais le message d'erreur est "// div [@id = 'Employee']/div [2]/span [1] n'existe pas". Je suppose que c'est ok mais je préférerais qu'il dise "age_x n'existe pas".

Je ne sais pas comment imprimer le nom de la variable. J'ai essayé d'utiliser Class et getFields() mais cela ne semble pas fonctionner.

Ce que je dois faire est de dupliquer le tableau et mettre chaque élément entre guillemets comme ceci:

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

puis obtenir le nombre d'entrées et utiliser

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"); 
    } 
} 

mais comme vous pouvez le voir Cela peut devenir une douleur. Est-il possible d'obtenir le nom de xp? Peut-être non, comme j'ai peur quand il crée le tableau, il remplace la valeur de chaque chaîne? Et comme vous pouvez le voir, ceci n'est pas spécifique à xpaths.

+0

Au lieu d'une liste, stockez-les dans une carte 'où la clé est le nom de la variable. – azurefrog

Répondre

0

Je ne sais pas comment imprimer le nom de la variable.

Avec votre tableau actuel, vous ne pouvez pas (raisonnablement *) sauf si vous pouvez déduire le nom de la variable de la chaîne. Cette ligne:

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

... copie la valeur de employeeID_x, etc., dans le tableau. Il n'y a pas de lien permanent entre cette valeur et la variable qu'il est venu, comme dans ce code:

a = b; 

... il n'y a pas de lien permanent entre a et b.

Votre solution de tableaux parallèles fonctionne mais, comme vous l'avez dit, elle n'est pas idéale. L'utilisation d'un Map peut être un peu mieux:

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

Puis boucle à travers les entrées, ce qui vous donnent le nom et la valeur de la carte. Cela a encore quelques répétitions (par ex., dans chaque appel put vous devez taper le nom de la variable deux fois), mais c'est beaucoup mieux d'un point de vue de la maintenance: Plus difficile d'obtenir les deux désynchronisés.

Une autre option consiste à utiliser la réflexion: Votre choix serait des noms des variables, et vous obtiendrez la valeur de la variable à l'aide Class#getDeclaredField pour obtenir une instance Field pour, puis obtenir la valeur par Field#get. Par exemple, votre choix serait:

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

... puis:

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 
} 

* "raisonnablement" - Vous pourriez avoir le code d'erreur de comparer la chaîne à chacun de vos champs et signaler le match, p.ex.

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

... mais ... blech. :-) (Et il suppose que deux de ceux-ci n'ont jamais la même valeur.)

+1

blech yeah ;-) Je pense que la carte est la meilleure façon – Tony