2017-01-14 101 views
0

我使用Selenium創建了測試框架併爲測試報告設置了ExtentReports。使用頁面對象模型和@FindBy批註字段爲每個頁面創建自己的WebElement存儲。現在我想創建自定義註釋@Name測試報告中WebElements名稱的自定義註釋實現

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

並且實現它,以便能夠在我的報告中稍後使用每個WebElement的描述。我有我自己的實現click()方法的

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

我能夠獲得一流的註釋與反思喜歡這裏

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

所有元素的描述,但不能得到特定元素的描述用於我的點擊方法。

任何想法如何實現?

回答

0

只是從傳遞給click方法的參數中,沒有辦法獲取註釋。這是因爲註釋位於gmail字段,而不是WebElement類。因此,爲了得到@Name註釋的唯一方法是先拿到Field代表您gmail場,那將必須通過聲明類來完成:

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

剛從click方法的參數,你可以只能達到對WebElement類本身如定義的註釋:

@SomeAnnotation 
public class WebElement {...} 

但這不是針對你的情況有用的東西。

實現類似於你想要的東西,你可能:

  • 反思性分析類,提取所有@Name倒是領域,並與字段值一起收集元,也許變成某種包裝的例如NamedElement,將有來自@Name的描述和WebElement本身
  • 反思性調用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"); 
    } 
} 

不知道這是否是適當/可用你的情況,但它的精神食糧。