2017-09-04 4 views
0

Description du problème: Vous devez créer une annotation personnalisée qui crée une chaîne de caractères en tant qu'argument et la traite et renvoie Weblement dans le cadre de sérénité. J'ai essayé le code via des annotations personnalisées + google inject mais je n'ai pas pu initialiser ma page pendant la sérénité d'exécution. Est-ce que somebod peut fournir des conseils sur la même chose?Problème d'initialisation de la création d'annotations personnalisées avec Serenity Framework

code:

HomePage Classe

public class Homepage { 
    @FindBy(css = ".sbibod") 
    public SearchForm searchForm; 

@AutoxpathAnnotation(ValuesPair = ".sbibod") 
public WebElement searchForm2; 

Interface Annotation

//import net.serenitybdd.core.annotations.findby.How; 

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 

public @interface AutoxpathAnnotation { 


      String[] ValuesPair() default {"{Customer Service Name2}"}; 

} 

Proceess Implémentations

 Class c = obj.getClass(); 
// Here need to Pass HomePage Object, Don't Know How to Pass through Page Object Model. Also need to know where this function needs to be written. 

     @SuppressWarnings("unchecked") 
     Annotation an = c.getAnnotation(AutoxpathAnnotation.class); 
     AutoxpathAnnotation ref = (AutoxpathAnnotation)an; 
     xapthform = "//label[contains(text(),'"+VisibleText+"')]/../following-sibling::*/select"; 

      //Input will Handle Checkbox, Button and radioBox 
     if (type.equals("input")) { 
      xapthform = "//label[contains(text(),'"+VisibleText+"')]/../following-sibling::*/input"; 

     if (type.equals("textarea")) { 
      xapthform = "//label[contains(text(),'"+VisibleText+"')]/../following-sibling::*/textarea"; 
     } 

     System.out.println("Searching values on the Screen: "); 
     System.out.println("------------------------------------------------------"); 

     return (WebElement) getDriver().findElement(By.xpath(xapthform)); 

Je reffered certains documents dont l'utilisation s injection-using-guice

public class DriverModule extends AbstractModule implements MethodInterceptor { 
    @Inject 
    private WebDriver driver; 

    private static Injector injector; 


    @Override 
    protected void configure() { 
     bind(WebDriver.class) 
      .toProvider(WebDriverProvider.class) 
      .in(Singleton.class); 

    //Todo some Operation 

    }  

    But not sure how it will work exactly in RunTime. 

Répondre

0

Les annotations personnalisées ne sont pas faciles à injecter dans des structures existantes. Vous pouvez utiliser l'annotation @WhenPageOpens sur votre objet de page pour effectuer la configuration personnalisée requise, par ex. (Où InitialiseAutoxpathFields est une classe que vous écrivez pour effectuer votre traitement d'annotation personnalisé).

+0

J'ai essayé, mais pas en mesure d'injecter mon traitement d'annotation. il n'est pas capable d'invoquer ma classe. – user216112

0

J'ai ajouté ce PR https://github.com/serenity-bdd/serenity-core/pull/1048 pour implémenter vos annotations personnalisées dans Serenity.

Ajout d'une implémentation de cette nouvelle interface CustomFindByAnnotationService et la mise en œuvre du org.openqa.selenium.By Comme dans cet exemple:

public class ByReact extends By { 

private static final char DOUBLE_QUOTE = '"'; 
private static final String SINGLE_QUOTE = "'"; 

private final String reactSelector; 

public ByReact(String reactSelector){ 
    this.reactSelector = reactSelector; 
} 

@Override 
public WebElement findElement(SearchContext context) { 
    String jquery = "return __retractor(" + quoted(reactSelector) + ")[0];"; 
    return (WebElement) ((JavascriptExecutor) context).executeScript(jquery); 
} 

@Override 
public List<WebElement> findElements(SearchContext context) { 
    String jquery = "return __retractor(" + quoted(reactSelector) + ");"; 
    return (List<WebElement>) ((JavascriptExecutor) context).executeScript(jquery); 
} 

private String quoted(final String reactSelector) { 
    if (reactSelector.contains("'")) { 
     return DOUBLE_QUOTE + reactSelector + '"'; 
    } else { 
     return "'" + reactSelector + SINGLE_QUOTE; 
    } 
} 

public String toString() { 
    return "By.ByReact: " + reactSelector; 
} 

}

+0

Merci. Je vais vérifier et vous mettrai à jour. – user216112