从页面对象到页面资源,robotframework如何布局,维护性更好

2024-06-11 15:38

本文主要是介绍从页面对象到页面资源,robotframework如何布局,维护性更好,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在国外网站上找到了一篇文章,把它翻译了出来,英语水平很烂,想喷就喷吧

原文地址:点击打开链接


前提:

我真的不想叫这个为Page Object(页面对象),因为Robot Framework(RF) 它并不是一个面向对象框架.因此本着对Page Ojbect 和 RF 负责任的态度,我叫它Page Resource(页面资源)。你应该听说过页面对象的优点并且已经在自动化测试过程中使用过它了。你是对的。然而怎样将它应用到RF上还有一些需要搞明白的地方。


思想:

最基本的思想是,在网站上的每个页面都创建一个测试对象,这个对象封装了他们各自需要测试的东西。这个页面对象包含所有的与测试系统交互的功能,并且能够扩展第三方类库,例如:Selenium。
通常在一个页面对象所拥有的能力是一些针对于你的应用实现域内的逻辑功能,例如“登录应用”。
然后实际的测试是基于这些高层次的资源,由于缺乏合适的字眼,我将这些高层次的资源叫做Service(一种服务),之所以这么叫他,是因为可以像呼叫企业软件应用服务一样使用它。
可以把它想象为一个层次关系,类似于:



最高层是你的测试,你的测试应该包含一个或者多个service级别资源,但是不应该包含任何page级别的资源.这是因为我们想要从SUT的改变中尽可能的隔离出来
假设,系统上的主页某些部分修改了,你需要改变测试。这可能不费多少功夫。但是我们说的是你有200个测试,你需要到每个测试下面就更新他们,这太蛋疼了,尤其是你没有像开发人员那样特制的重构工具的情况下。由于你隔离抽象出来这些层,你仅仅需要改变一点点服务层资源。

举个例子;高层次的测试好比是登录某个应用程序和检查用户账户的余额
下一层是服务层,服务层包含辅助的关键字和包含和使用页面资源。例如辅助关键字是像用户一样打开web 浏览器和登录你的应用程序。用户不应该被定义而应该通过高层次传递过来。最后是底层的页面资源,页面资源应该调用Selenium2Library,这样隔离了类库的改变对服务和测试的影响,它同时能够实现切换整个类库。假如某一天Selenium3Library 出来了或者某个人写了个更好的类库TonyWebdriver ,页面对象都不知道如何去浏览页面了,此时应该知道如何去重新表述它。


实例:

我将要去做一个简单维基百科的测试,通常我们在底层测试集中会有一些参数,但是为了演示我全部硬编码了。场景如下,我将要去测试的是进入Nissan Motors页面,通过搜索一个 Nissan 240SX,然后点击页面上的一个链接来获得 Nissan Motors (Corporate) 维基百科的页面


我的例子包含三个页面资源
Wikipedia Home Page
Nissan 240SX Page on Wikipedia
The Nissan Motors Page on Wikipedia


有一个高层次服务资源文件,里面只有一个测试,让我们首先来看一下这个测试
*** Settings ***
Test Teardown   Log TestRun
Documentation   A test suite with a single test for try page objects against the
...             Wikipedia Site
Resource        wikipedia-resource.txt


*** Test Cases ***
# This Test Case doesn't use the the Page Resources, it uses a higher level wikipedia resource
Goto Nissan Motors Page Via Searching and Clicking
        Search for Nissan 240SX on Wikipedia
        From Nissan 240SX page goto Nissan Motors Page
        #    [Teardown]  Close Browser


*** Keywords ***
Log TestRun
        ${html_src} =  Log Source
        Run Keyword If Test Failed  Create File   target/robot/myerror.html  ${html_src}
        #    Close Browser


我们定义了一个测试用例,用到了两个来自Wikipedia 服务的关键字


下面Wikipedia 服务
*** Settings ***
Documentation  A resource file containing the application specific keywords
...            that create our own domain specific language. This resource
...            implements a service resource
Library        Selenium2Library
Library        OperatingSystem
Resource       wikipedia-homepage.txt
Resource       wikipedia-nissan240sx-page.txt
Resource       wikipedia-nissan-motors-page.txt


*** Variables ***
${SERVER}               www.wikipedia.org
${BROWSER}              firefox
${DELAY}                0
${HOME PAGE URL}        http://${SERVER}


*** Keywords ***
# Uses Wikipedia and Nissan 240sx Page Resources
Search for Nissan 240SX on Wikipedia
        Open Browser To Wikipedia Home Page
        Search For Nissan 240SX
        Verify Nissan 240SX Page

# Uses Nissan 240sx and Nissan Motors Page Resources
From Nissan 240SX page goto Nissan Motors Page
        Click Link and goto Nissan Motors Page
        Verify Nissan Motors Page


在这个服务中,你可以看到我拥有三个页面资源


 Wikipedia 主页资源如下:
 Library        Selenium2Library
Library        OperatingSystem


*** Keywords ***
Open Browser To Wikipedia Home Page
    Open Browser  ${HOME PAGE URL}  ${BROWSER}
    Maximize Browser Window
    Set Selenium Speed  ${DELAY}
    Title Should Be  Wikipedia


Search For Nissan 240SX
        Input Text  searchInput  Nissan 240sx
        Click Button  go
        
首先我需要调用 “Open Browser To Wikipedia Home Page”.这个关键字是打开浏览器浏览到Wikipedia主页,我没有理由把它放到一个更高层次,但我可以。我喜欢这样是因为它给我一目了然的是现在我在主页上了。
可以查看“Tittle Should Be  Wikipedia”那行,那就告诉我我是在主页, Nissan 240sx 页面资源非常简单
Library        Selenium2Library


*** Keywords ***
Verify Nissan 240SX Page
        Title Should Be  Nissan 240SX - Wikipedia, the free encyclopedia

Click Link and goto Nissan Motors Page
        Click Link  Nissan
        
它包含一个验证关键字和点击链接关键字,这个页面资源能够像你期望的那样承担一些测试SUT的任务。它假设有一个名叫“Nissan”的链接在 Nissan corporate 页面上,然而每个人都可以改变这个页面,也就是说决定重写这个页面,如在Nissan Motorsports页面改变链接叫“Manufacture“来代替 “Nissan” ,如果你有200个测试通过这个操作(搜索和点击)和直接重复浏览这个方法(是由于你手动剪切和粘贴),你需要改变200个测试。然而由于你使用了页面资源模式你仅需要改变一个文件从而节省了大量的时间。



这篇关于从页面对象到页面资源,robotframework如何布局,维护性更好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051584

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

JavaScript全屏,监听页面是否全屏

在JavaScript中,直接监听浏览器是否进入全屏模式并不直接支持,因为全屏API主要是关于请求和退出全屏模式的,而没有直接的监听器可以告知页面何时进入或退出全屏模式。但是,你可以通过在你的代码中跟踪全屏状态的改变来模拟这个功能。 以下是一个基本的示例,展示了如何使用全屏API来请求全屏模式,并在请求成功或失败时更新一个状态变量: javascriptlet isInFullscreen =

加载资源文件失败

背景         自己以前装了一个海康的深度学习算法平台,试用期是一个月,过了一个月之后,因为没有有效注册码或者加密狗的支持了导致无法使用,于是打算卸载掉,在卸载一个软件的时候,无论是使用控制面板还是软件自带的卸载功能,总是卸载不掉,提示“加载资源文件失败”。该软体主要包括以下两部分: 用自带卸载功能卸载的时候分别提示如下:     用控制面板卸载的时候反应很慢,最后也是提示这个

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e

vue子路由回退后刷新页面方式

最近碰到一个小问题,页面中含有 <transition name="router-slid" mode="out-in"><router-view></router-view></transition> 作为子页面加载显示的地方。但是一般正常子路由通过 this.$router.go(-1) 返回到上一层原先的页面中。通过路由历史返回方式原本父页面想更新数据在created 跟mounted