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

发布时间:2023年12月18日

本文阅读的前提:同学们知道如何进行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 识别元素的方式分离了!

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

文章来源:https://blog.csdn.net/liwenxiang629/article/details/135061312
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。