我将Cucumber和Selenide用于我的UI测试,并且我有以下方法

public static void initPage(String pageName) throws Exception {
    Set<Class<?>> annotated = new Reflections(PAGES_PACKAGE).getTypesAnnotatedWith(PageTitle.class);

    for (Class classToInit : annotated) {
        PageTitle annotation = (PageTitle) classToInit.getAnnotation(PageTitle.class);
        if (annotation.name().equals(pageName)) {
            classToInit.newInstance();
            lastInitialized = substringAfter(classToInit.toString(), "class ");
            lastInitClass = classToInit;
            return;
        }
    }

    throw new AutotestError("Could not find page to init: " + pageName);
}

public static SelenideElement findElementByTitle(String elementName) throws IllegalAccessException, InstantiationException {
    Set<Field> annotated = new Reflections(lastInitialized, new FieldAnnotationsScanner()).getFieldsAnnotatedWith(ElementTitle.class);

    for (Field field : annotated) {
        ElementTitle annotation = field.getAnnotation(ElementTitle.class);
        if (annotation.name().equals(elementName)) {
            field.setAccessible(true);
            SelenideElement el = (SelenideElement) field
            return el;
        }
    }
    throw new AutotestError("Element not found: " + elementName);
}


我对反射非常陌生,并尝试使用org.reflections.Reflections库构建页面对象模式,以在各种页面对象类中搜索带注释的字段。但是,我在从第二种方法中获得的字段返回SelenideElement时遇到问题(此刻SelenideElement el = ...行是完全错误的)。如何在测试中获得可用作SelenideElement(带有@ElementTitle和@FindBy批注)的字段?提前致谢。

最佳答案

你应该换线
SelenideElement el = (SelenideElement) field

SelenideElement el = ((SelenideElement) field.get(pageObject))

说明

根据Field.get的文档:
返回指定对象上此Field表示的字段的值。如果值具有原始类型,则该值将自动包装在对象中。

10-04 13:06