当前位置: 首页 > 知识库问答 >
问题:

测试报告中WebElements名称的自定义注释实现

柯永福
2023-03-14

我用Selenium创建了测试框架,并为测试报告设置了ExtentReports。对字段使用页面对象模型和@FindBy注释为每个页面创建自己的WebElements存储。现在我想创建自定义注释@Name

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

以及它的实现,以便能够在我的报告后面使用每个WebElement的描述。我有我自己的实现点击()方法

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

我能够得到所有元素的描述注释类与反射像这里

是否可以在java中读取注释的值?

但无法获取我的单击方法中使用的特定元素的说明。

有什么办法可以做到这一点吗?

共有1个答案

齐财
2023-03-14

仅从传递给click方法的参数,无法获取注释。这是因为注释位于gmail字段中,而不是WebElement类中。因此,获取@Name注释的唯一方法是首先获取表示您的gmail字段的字段,这必须通过声明类完成:

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

仅从单击方法的参数,您只能访问在WebElement类本身定义的注释,例如:

@SomeAnnotation
public class WebElement {...}

但这对你的情况没有任何用处。

要实现与您想要的类似的目标,您可以:

  • 反思性地分析类,提取所有@Name'd字段,并将元数据与字段值一起收集,可能会将其放入某种包装器中,例如NamedElement,该包装器具有来自@Name和<代码>WebElement本身
  • 反射地调用单击方法,为其提供所需的meta(在您的案例中是描述)。但要做到这一点,您需要以某种方式知道为每个字段调用哪个方法(例如通过另一个注释),使您的逻辑编码在实际代码之外。在某些情况下可能有意义,但总的来说可能是个坏主意。

第一个想法的快速(未编译、未测试)代码示例:

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

不知道这在您的情况下是否合适/可用,但值得思考。

 类似资料:
  • 我正在从事一个需要以编程方式调用TestNG(使用数据提供程序)的项目。情况很好,只是在报告中,我们得到了@测试方法的名称,这是一种处理许多情况的通用方法。我们希望在报告中得到一个有意义的名字。 我一直在研究这个问题,发现了三种方法,但不幸的是,所有方法都失败了。 1) 实施ITest 我在这里和这里都发现了这个 我一输入@Test方法就设置了我想要的名称(对于我尝试的所有3种方式,这就是我设置名

  • 使用JUnit 4,调用JUnit的ant构建脚本总是将测试类名报告为“未知”。有没有一种不涉及从测试用例派生的方法来解决这个问题? 我用@测试注释声明我的测试方法,例如: 有些est.java: 并将它们收集到一个测试套件中: 所有测试。java: 然后我通过NetBeans调用ant任务,它对JUnit运行的打印结果有很好的集成支持。除了测试名称之外,一切似乎都找到了,例如: 测试运行正常,我

  • 我正在进行跨浏览器测试,在4种浏览器Chrome、Firefox、IE和Safari上运行多个类中的每个测试方法。 testng HTML报告 即使testng HTML报告会有浏览器名称,但与测试方法相对应也很好。 我找到了这个链接,但我只需要浏览器列旁边的方法列到自定义报告中的链接

  • # 5.1 自定义报告是什么? {#51-自定义报告是什么?} 在进行网站分析的时候,通常需要关联多个维度进行分析, 同时根据不同组合维度,选取合适的衡量指标。 例如,衡量 广告流量 达成的事件数 或 不同来源流量的所使用客户端及其地域分布。 在默认报告中,系统提供了单个维度的分析视角。 而自定义报告则可实现关联不同分析维度,衡量站点数据表现。 示例如下: 维度1 维度2 维度3 衡量指标 广告维

  • 问题内容: 我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法