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

使用反射获取Pagefactory WebElement名称

黎腾
2023-03-14

我使用的是selenium pagefactory,并引入了一个注释@Name(Description=“Username”),用于所有WebElement。稍后,我需要在自定义方法中找到描述值,以便进行报告,例如:

public static void click(WebElement element) throws Throwable {
        try {
            element.click();
        } catch(ElementNotInteractableException E1) {
            throw new UnableToInteractWithElementException("Unable To Interact With " + WebElement Descriptionn);
        }
    }

我的@Name注释界面和pagefactory如下所示:

名称接口

@Target({ElementType.FIELD, ElementType.TYPE,ElementType.CONSTRUCTOR})
public @interface Name {    
    String Description() default "";
}
@Name(Description = "Username")
@FindBy(id="txtLoginID")
public WebElement username;

在使用反射时,我面临的问题是需要定义pagefactory的类名,并提供字段名作为字符串“username”,以检索注释值。

我希望能够通过只提供我的WebElement而不提供其他对象来检索注释值到我的Click(WebElement元素)方法。

共有2个答案

鲁博瀚
2023-03-14

嗨,我不是反思的专家,我不确定我的问题是否正确。您可能有另一种最佳的方法,但遵循一种解决方案,创建一个接收WebElement并返回描述的方法:

private static String getDescription(WebElement element) throws IllegalAccessException {
    //Get all the fields of the page object.
    for (Field field : YOUR_PAGE_OBJECT.class.getDeclaredFields()) {
        Name name = field.getAnnotation(Name.class);
        //Consider only the ones that is annotated by your @Name
        if (name != null) {
            WebElement classElement = (WebElement) field.get(element);
            //Get the element from the class and compare with your current.
            if (classElement != null && (classElement).equals(element)) {
                return name.Description();
            }
        }
    }
    return ":C"; // or throw something, whatever you want...
}

您的代码将以如下方式结束:

public static void click(WebElement element) throws Throwable {
        try {
            element.click();
        } catch(ElementNotInteractableException E1) {
            throw new UnableToInteractWithElementException("Unable To Interact With " + getDescription(element));
        }
    }
宋育
2023-03-14

我可以向您展示如何使用反射部分获取描述。

首先,我们必须修复注释Name,因为您没有添加RetentionPolicy:

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.CONSTRUCTOR})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Name {
    String Description() default "";
}

现在,我所做和测试的是,我们为名称创建存储,并在初始化页面对象时存储它们,如下所示:

public class NameStore {
    public static HashMap<WebElement, String> map = new HashMap<>();

    public static void store(Object pageObject) {
        Field[] fields = pageObject.getClass().getDeclaredFields();
        for (Field field : fields) {
            Name annotation = field.getAnnotation(Name.class);
            if (annotation != null) {
                try {
                    map.put((WebElement) field.get(pageObject), annotation.Description());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static String getDescription(WebElement element) {
        return map.get(element);
    }
}

您将Page Object作为参数传递,@Name注释被读取并存储到HashMap中

初始化存储在构造函数中的名称:

    public PageObject(WebDriver driver) {
        PageFactory.initElements(driver, this);
        NameStore.store(this); //THIS IS CRUCIAL. Also make sure that's always AFTER PageFactory initialization
    }

现在,要更新您的,请单击方法:

public static void click(WebElement element) throws Throwable {
        try {
            element.click();
        } catch(ElementNotInteractableException E1) {
            throw new UnableToInteractWithElementException("Unable To Interact With " + NameStore.get(element));
        }
    }

希望有帮助!

免责声明:我没有在多线程的上下文中测试它。我没有在构造函数的上下文中测试

 类似资料:
  • 问题内容: 我正在尝试使用Go的反射系统来检索函数的名称,但是在调用其类型的Name方法时会得到一个空字符串。这是预期的行为吗? 这是我如何解决问题的简单示例: 问题答案: 解决方案是使用FuncForPc返回一个。 返回: 如果需要,只需将其标记化即可。

  • 问题内容: 在这里打印“ Foo”的方式是什么?在此示例中,打印的是“字符串”。 http://play.golang.org/p/ZnK6PRwEPp 问题答案: 你要。上的方法将返回一个结构,该结构描述该字段,其中包括名称以及其他信息。 无法检索代表特定字段值的字段名,因为这是包含结构的属性。

  • 我正在创建许多POJO,并且必须为每个POJO创建方法。我认为创建一个类来使用反射API为我完成工作会更容易——在一个地方创建功能并在每个POJO中使用它。 POJO中的所有字段都是私有的。POJO是JSON对象的Java对象表示。 要求是遍历类中的字段,并列出字段和值。 我目前正在一个名为的类上测试该功能。 下面是我用来列出字段名和值的类: 我将< code>ChannelResource类的一

  • 下面是我的示例类,我希望通过在这行中使用反射来获取y和z字段(Field[]fields=forName.getDeclaredFields();)我得到了空数组。如果y和z不是类结构的一部分,那么它们属于哪一部分

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 问题内容: 我知道如果知道注释类,就可以轻松获取特定注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类不了解。我只想使用反射在运行时获取所有注释类名称及其属性,以将类信息转储为例如JSON文件的目的。我该如何轻松地做到这一点。 此方法将仅返回注释接口的动态代理。 问题答案: 与预期的相反,注释的元素不是属性-它们实际上是返回提供的值或默