|
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注解
|
|