PageObject中提供了一个@FindBy注解,也非常好用,但由于其是一次性全部初始化所有的WebElement,对于当前还不存在于页面上的Element在初始化时就会报错,为了解决这个问题,自然就不能用这个@FindBy注解了,而我们可以自已去写一个类似的注解来解决这个问题,下面是思路的实现:
自定义一个@FindBy注解
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface FindBy { String name(); int age(); int lazy() default 0; }
定义一个TestInfo类来模拟WebElement类
public class TestInfo { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "TestInfo [name=" + name + ", age=" + age + "]"; } }
解析@FindBy注解
public class PageUtil { private static void initialLazyInfo(Object obj, int lazy) { try{ Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { if(field.isAnnotationPresent(FindBy.class) && field.getType().equals(TestInfo.class)){ FindBy findBy = field.getAnnotation(FindBy.class); if(findBy.lazy()==lazy){ TestInfo temp = new TestInfo(); temp.setName(findBy.name()); temp.setAge(findBy.age()); field.setAccessible(true); field.set(obj, temp); } } } }catch(Exception e){ e.printStackTrace(); } } public static void initialLazy(Object obj){ PageUtil.initialLazyInfo(obj, 0); } public static void initialLazy(Object obj, int lazy){ PageUtil.initialLazyInfo(obj, lazy); } }
使用方式
public class DemoPage { public DemoPage() { PageUtil.initialLazy(this); } @FindBy(name="zf1", age=1) private TestInfo info1; @FindBy(name="zf2", age=2, lazy=1) private TestInfo info2; public void test(){ System.out.println("info1 is: " + info1); System.out.println("info2 is: " + info2); PageUtil.initialLazy(this, 1); System.out.println("info2 is: " + info2); } public static void main(String[] args) { DemoPage dp = new DemoPage(); dp.test(); } }
运行结果
info1 is: TestInfo [name=zf1, age=1]
info2 is: null
info2 is: TestInfo [name=zf2, age=2]
说明
- 将TestInfo初始化进行了分层次的初始化
- 在需要用到的地方用
PageUtil.initialLazy(this, int);
进行初始化
以上虽然实现了分层次的初始化,但是在要用到的地方都需要调用PageUtil.initialLazy(this, int);
,还是显得有点麻烦,要解决这个问题,还得从改造WebElement类开始,然后自定义一个@FindBy注解,并且在需要用到元素的地方再去判断并初始化。
定义@FindBy注解
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface FindBy { String id() default ""; String name() default ""; String className() default ""; String css() default ""; String tagName() default ""; String linkText() default ""; String partialLinkText() default ""; String xpath() default ""; }
将@FindBy注解中的值结赋到一个中间类中去,在Page类进行初始化的时候进行赋值
public class FindElement { private String id; private String name; private String className; private String css; private String tagName; private String linkText; private String partialLinkText; private String xpath; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getCss() { return css; } public void setCss(String css) { this.css = css; } public String getTagName() { return tagName; } public void setTagName(String tagName) { this.tagName = tagName; } public String getLinkText() { return linkText; } public void setLinkText(String linkText) { this.linkText = linkText; } public String getPartialLinkText() { return partialLinkText; } public void setPartialLinkText(String partialLinkText) { this.partialLinkText = partialLinkText; } public String getXpath() { return xpath; } public void setXpath(String xpath) { this.xpath = xpath; } }
Page类实例化时初始化@FindBy注解并赋值给FindElement类
public class PageUtil { public static void initialWebElement(Object obj) { try{ Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { if(field.isAnnotationPresent(FindBy.class) && field.getType().equals(WebElement.class)){ FindBy findBy = field.getAnnotation(FindBy.class); FindElement findElement = new FindElement(); if(!"".equals(findBy.id())){ findElement.setId(findBy.id()); }else if(!"".equals(findBy.name())){ findElement.setName(findBy.name()); }else if(!"".equals(findBy.className())){ findElement.setClassName(findBy.className()); }else if(!"".equals(findBy.css())){ findElement.setCss(findBy.css()); }else if(!"".equals(findBy.tagName())){ findElement.setTagName(findBy.tagName()); }else if(!"".equals(findBy.linkText())){ findElement.setLinkText(findBy.linkText()); }else if(!"".equals(findBy.partialLinkText())){ findElement.setPartialLinkText(findBy.partialLinkText()); }else if(!"".equals(findBy.xpath())){ findElement.setXpath(findBy.xpath()); } WebElementExt ext = new WebElementExt(findElement); field.setAccessible(true);