绝对干货!自动化测试PO设计模式的进阶实现(附源码),适合想提升编码能力的测试同学

绝对干货!自动化测试PO设计模式的进阶实现(附源码),适合想提升编码能力的测试同学_第1张图片

本文阅读的前提:同学们知道如何进行Selenium自动化测试并了解什么是PO设计模式!对于代码基础较弱的测试同学希望多读几次文章并上手操作,这篇文章看懂后,大家的编码能力就会进步了!代码哪里不懂欢迎留言!

PO模式的设计问题

在前面的文章

无论您用selenium、appium还是playwright都必须使用PO设计模式-CSDN博客 

介绍了如何通过PO设计模式解决自动化测试脚本中应对UI页面变化的问题,概要方案如下 

driver.findElement(By.id("kw")).sendKeys("selenium3");

改造成

driver.findElement(By.id(ObjectStore. Search_Inputbox)).sendKeys("selenium3");

但是这个方案仍然存在一个问题!大家试想,如果无法通过By.id 方式识别元素了,该怎么处理呢?例如,页面改造后只能通过xpath来定位元素了,那么就需要更改代码为

driver.findElement(By.xpath("...")).sendKeys("selenium3");

显然还是需要再次修改源码的,这显然不是我们希望看到的结果,该如优化呢?

PO模式的优化实现

优化的核心实现思路也非常简单:就是在方法driver.findElement(By.xpath("..."))中

把By.xpath("...")或者By.id("...") 作为参数就可以了!

实现代码如下:

首先、在 ObjectStore 中 ,改变变量的保存方式:
  把public static final String Search_Inputbox="kw";
  更改为public static final String Search_Inputbox="id=kw";

其次、在一个工具类ToolKit中写一个静态方法(目的是方便其他类对其调用)parseObject 并返回By(目的是被driver.findElement使用),最后把ObjectStore中的变量作为参数传入该方法进行解析,具体实现如下:

  public static By parseObject(String p_object) {
            
        String newObject = null;
            
            if (p_object.startsWith(".//") || p_object.startsWith("//")) {
                return By.xpath(p_object);
            } else if (p_object.startsWith("link=") || p_object.startsWith("Link=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.linkText(newObject);
            } else if (p_object.startsWith("xpath=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.xpath(newObject);
            } else if (p_object.startsWith("id=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.id(newObject);
            } else if (p_object.startsWith("css=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.cssSelector(newObject);
            } else if (p_object.startsWith("class=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.className(newObject);
            } else if (p_object.startsWith("tagName=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.tagName(newObject);
            } else if (p_object.startsWith("name=")) {
                newObject = p_object.substring(p_object.indexOf("=") + 1);
                return By.name(newObject);
            } else
                return null;
        }


做过selenium的同学都知道,上面的代码覆盖了selenium识别web元素的各种方式,核心就是解析

变量的开头元素,然后返回对应的By.***方法!

最后脚本改造完成的样子如下所示:

driver.findElement(ToolKit.parseObject(ObjectStore.Search_Inputbox)).sendKeys("selenium");

可以看到,脚本完全与selenium 识别元素的方式分离了!

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

你可能感兴趣的:(Java,自动化测试,测试开发,java,selenium)