2017-01-14 3 views
0

テストレポートのためにSeleniumでテストフレームワークを作成し、ExtentReportsをセットアップしました。各ページのWebElementsの独自のストアを作成するためのフィールドに、使用されたページオブジェクトモデルと@FindByアノテーション。今度はカスタムアノテーションを作成したいと思います。@NameテストレポートのWebElements名のカスタムアノテーション実装

@Name(description = "google main page") 
@FindBy(linkText = "Gmail") 
private WebElement gmail; 

そして、後でレポートの各WebElementの説明を使用できるように実装しています。私は、クリック()メソッドの私の独自の実装を持って、私は

Is it possible to read the value of a annotation in java?

ここのように反射してクラスに注釈を付け、すべての要素の説明を取得することができるよが、特定の要素の説明を取得することはできません

public static void click(WebElement element) { 
    try{ 
     element.click(); 
     TestReport.addLog(LogStatus.INFO, "Element "+NameImpl.getDescription(element)+" clicked"); 
    } catch (NoSuchElementException e) { 
     TestReport.addLog(LogStatus.ERROR, "Element "+NameImpl.getDescription(element)+" not found"); 
    } 
} 

私のクリックメソッドで使用されます。

これを実現する方法はありますか?

答えて

0

clickメソッドに渡されたパラメータからちょうどgetアノテーションがありません。この理由は、注釈はWebElementクラスではなく、gmailフィールドにあります。だから、@Name注釈を取得する唯一の方法は、最初にあなたのgmailフィールドを表すFieldを取得することであり、それは宣言クラスを介して行われなければならない。

ClassWithGmailField.class.getField("gmail").getAnnotation(Name.class).description() 

だけclickメソッドのパラメータから、あなたの可能性

@SomeAnnotation 
public class WebElement {...} 

が、これはあなたのケースでは何のために有用ではありません。WebElementクラス自体例えば上で定義された注釈をのみに達します。あなたが望むものに似た何かを達成するために

、あなたは可能性が潜在的に:

  • 反射的、クラスを分析し、すべての@Name D「のフィールドを抽出し、おそらくラッパーのいくつかの種類に、フィールド値と一緒にメタを収集例えばNamedElement@NameWebElement自体の説明がある
  • clickメソッドには、必要なメタ情報(ケースの説明)を指定してください。しかし、このためには、各フィールド(例えば、さらに別の注釈)で呼び出すメソッドを何とか知り、ロジックを実際のコードの外部にエンコードする必要があります。場合によっては意味をなさないかもしれませんが、おそらく一般的には悪い考えです。

最初のアイデアの迅速な(、コンパイルされていないテストされていない)のコード例:

public class NamedElement extends WebElement { 

    public String description; 
    public WebElement element; 

    public NamedElement(String description, WebElement element) { 
    this.description = description; 
    this.element = element; 
    } 
} 

public class NamedElementExtractor { 

    public static Collection<NamedElement> getNamedElements(Object instanceWithWebElements) { 
    //instanceWithElements in your case would be an instance of the class that has the "gmail" field, i.e. the one I referred to as ClassWithGmailField above 
    Collection<NamedElement> namedElements = new List<NamedElement>(); 
    for (Field field : instanceWithWebElements.getClass().getDeclaredFields()) { 
     field.setAccessible(true); 
     //maybe first check field.isAnnotationPresent(Name.class) 
     String desc = field.getAnnotation(Name.class).description(); 
     WebElement element = field.getValue(instanceWithWebElements); 
     namedElements.add(new NamedElement(desc, element)); 
    } 
    } 
} 

... 

for (NamedElement namedElement : NamedElementExtractor.getNamedElements(instanceWithWebElements))) { 
    Click.click(namedElement); 
} 

... 

public static void click(NamedElement namedElement) { 
    try{ 
    namedElement.element.click(); 
    TestReport.addLog(LogStatus.INFO, "Element "+ namedElement.description +" clicked"); 
    } catch (NoSuchElementException e) { 
    TestReport.addLog(LogStatus.ERROR, "Element "+ namedElement.description +" not found"); 
    } 
} 

全くわからこれはあなたのケースで使用可能/適切であるが、それは思考のための食糧だ場合。

関連する問題