2017-08-11 1 views
0

J'utilise un fichier .properties pour le référentiel d'objets dans Selenium webdriver dans @FindBy().Comment rendre le fichier .properties temps de compilation pour les constantes @FindBy

Je reçois une erreur car @FindBy a besoin d'une valeur constante pour s'initialiser.

Existe-t-il un moyen de faire fonctionner la compilation de fichiers .properties?

extrait de code:

public class LoginPageID { 

    @FindBy(id=ObjectConstants.LOGINID) 
    public WebElement LoginID; 
} 

public class ObjectConstants { 
    public static final String LOGINID; 

    static { 
    Properties p = new Properties(); 

    try { 
     p.load(new FileInputStream("constants.properties")); 
     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     catch (IOException e) { 
     e.printStackTrace(); 
     } 
     LOGINID = p.getProperty("LOGINID"); 
    } 
} 

Répondre

1

Cette astuce n'est pas possible en Java. La valeur de votre constante ne sera disponible que lors de l'exécution du premier accès ObjectConstants. C'est pourquoi IDE vous signale une erreur.

J'ai eu votre idée, et cela me semble réaliste. Mais ... Le principal défi dans ce cas particulier est lié à la 3ème partie (WebDriver), que vous ne pouvez pas facilement redéfinir. Donc, techniquement, vous devez créer votre propre annotation, qui consomme idéalement une valeur enum paramétrée. Par exemple:

public enum Locator { 
    LOGIN_INPUT(getProperty("login")), 
    PASSWORD_INPUT(getProperty("password")); 

    private final String val; 

    Locator(final String val) { 
     this.val = val; 
    } 

    public String getVal() { 
     return val; 
    } 
} 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.TYPE}) 
public @interface Find { 

    Locator value(); 
} 

Ensuite, vous aurez besoin d'une usine sur mesure pour l'extraction des valeurs ENUM, les champs de mandatement ou vous approche de tout ce qui va utiliser.