我用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中读取注释的值?
但无法获取我的单击方法中使用的特定元素的说明。
有什么办法可以做到这一点吗?
仅从传递给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线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法