java - 从字段上的自定义注释访问值

标签 java selenium appium

假设我有以下基于Page Factory的代码

@AndroidFindBy(id = "cancel_action")
@CustomLog("Cancel Button")
public MobileElement btnCancel;

@AndroidFindBy(id = "ok_action")
@CustomLog("ok Button")
public MobileElement btnOk;


public void tap(MobileElement element) {
    element.tap(1, 500);
    //add the reflection code to print the value of CustomLog annotation
}

现在,如果我调用如下的 tap 方法,它应该打印 btnCancel 的“CustomLog”注释的值

tap(btnCancel);

我将能够成功点击指定的MobileElement 元素,因为它知道必须点击id = "cancel_action” 使用注释 @AndroidFindBy 现在,如果我想访问自定义注释(@CustomLog)值,即我的测试中的“取消按钮”,是否可以?我创建了一个名为“CustomLog”的注释,但是如何访问此注释的值作为此 MobileElement

的一部分

最佳答案

如果您想在运行时获取自定义注释(“取消按钮”)的值,反射是最佳选择。

首先,请确保您的注释具有租赁RUNTIME,否则一旦代码编译,它就不再存在:

@Retention(RetentionPolicy.RUNTIME)
public static @interface MyAnnotation {
  String value();
}

然后您可以像已有的一样使用注释:

@MyAnnotation("test")
public MobileElement element;

并简单地检索该特定字段的注释Field:

Field field = this.getClass().getDeclaredField("element");

并从注释中获取value():

MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
System.out.println(annotation.value());

因此,在我的示例中,这会将“test”打印到控制台。

关于java - 从字段上的自定义注释访问值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883224/

相关文章:

c# - 为什么在 "try"或 "catch"或 "finally"的范围内声明的变量没有?

java - 如何使用 Firebase 1.0.2 忽略对象模型的新字段

python - 如何使用 Selenium for Firefox (geckodriver) 将 navigator.webdriver 设置为未定义

python - 通过脚本更改 Chrome 首选项

c# - 如何在 selenium webdriver 中使用等待

java - 我是否需要自动化扫描 QR 的应用程序,是否有 Appium 功能可以从 JAVA 发送特定的 QR?

java - 如何编译 google-fhir 原型(prototype)文件

java - 如何为类中的参数创建 get 和 set 方法?

java - AppiumServerHasNotBeenStartedLocallyException : The local appium server has not been started

ios - 是否可以使用与 iOS 应用程序相同的初始状态来启动每个 Appium 测试?