BDD - SpecFlow Page Object Model POM
admin
2024-04-08 17:31:49
0

BDD - SpecFlow Page Object Model

  • 引言
  • POM 优势
  • POM 简单实现
  • POM 缓存实现
  • POM 层次实现
    • Parent - Child 关系
    • Component 关系

引言

前面文章《 BDD - SpecFlow Web UI 测试实践 》就运用到 Page Object Model,简称 POM,POM 是一种模式,结合 Selenium 用来抽取 Web UI,使得 UI 自动测试更易实现,今天就来详细介绍一下 POM 。

POM 优势

当运用 Selenium 时,总是用 WebElements 来访问不页面上不同的元素。可以利用 WebDriver 类中的方法 FindElement 和 FindElements 来定位到这些 WebElements。

如果你总是直接在 automation code 里直接使用这些方法,会造成大量的重复代码。这个时候就得考虑用 POM 了,将调用 FindElement(s) 方法隐藏在一个类里。

使用 POM 的好处:

  • 使得这些隐藏 FindElement(s) 方法的类重用
  • 如果 UI Element 有变化,只需修改一个地方
  • 减少 Binding 类对 HTML 结构的依赖

POM 简单实现

HTML:


Code:

public class PageObject
{private IWebDriver _webDriver;public PageObject(IWebDriver webDriver){_webDriver = webDriver;}public IWebElement txtUrl => _webDriver.FindElement(By.Id("txtUrl"));
}

public 构造函数中传入 WebDriver 实例,这个 WebDriver 依赖注入,详情参考 《 BDD - SpecFlow Context Injection 上下文依赖注入 》,当访问 TxtUrl 属性时,WebDriver 将在整个 Page 搜索 id 为 txtUrl 的 Element。注意,这里没有涉及到缓存,也就是说每次访问 TxtUrl 属性时,WebDriver 都会重新搜索一遍。

POM 缓存实现

HTML:


Code:

public class PageObject
{private IWebDriver _webDriver;private Lazy _txtUrl;public PageObject(IWebDriver webDriver){_webDriver = webDriver;_txtUrl = new Lazy(() => _webDriver.FindElement(By.Id("txtUrl")));}public IWebElement txtUrl => _txtUrl.Value;
}

还是在 public 构造函数中传入 WebDriver 实例,进行 WebDriver 依赖注入。只是利用 Lazy 这种简单的方式将 FindElement 方法的结果缓存起来。

只有第一次访问 txtUrl 属性时,才会触发调用 FindElement 方法,后面访问 txtUrl 属性时,只会返回第一次访问时缓存的值。这样有助于节省自动化执行时间,因为 WebDriver 针对同一 Element 只需搜索一次。

注意,如果你使用上面的缓存模式,当心页面和页面元素的生命周期。如果页面有发生变化,不要用老的 Element 对象。

POM 层次实现

Parent - Child 关系

HTML:

Code:

public class ParentPageObject
{private IWebDriver _webDriver;public ParentPageObject(IWebDriver webDriver){_webDriver = webDriver;}public IWebElement WebElement => _webDriver.FindElement(By.ClassName("A"));public ChildPageObject Child => new ChildPageObject(WebElement);
}public class ChildPageObject
{private IWebElement _webElement;private Lazy _txtUrl;public ChildPageObject(IWebElement webElement){_webElement = webElement;}public IWebElement WebElement => _webElement.FindElement(By.ClassName("B"));
}

本例中,我们稍微调整一下 HTML 文档,两个 div 元素有相同的 class 属性 B 值,但是我们只想为具有 class A 属性的 div 元素及其子元素创建 PageObject。

就好比一个或多个页面有相同的元素组件一样,我们可以分层次创建 POM 类。我们可以将元素组件单独创建 POM 类,作为 ParentPageObject 类的 ChildPageObject。

如果我们用相同的 WebDriver.FindElement 方法,我们将得到与 A div在同一层的 div元素。

但是每个 WebElement 都有 FindElement(s) 方法,使得我们可以在整个 HTML 文档的局部范围内定位元素。
所以我们可以通过传 parent- WebElement 到 ChildPageObject 类,只定位 A-div 内部的 B-div。

Component 关系

上面是采用 Parent - Child 层次结构,当然也可以 Component 层次结构,将HTML 文档稍微改一下,div A 和 div B 分别是 component,HomePageObject 分别包含 ComponentAPageObject 和 ComponentBPageObject。

HTML:

Code:

public class HomePageObject
{private IWebDriver _webDriver;public ParentPageObject(IWebDriver webDriver){_webDriver = webDriver;}public ComponentAPageObject componentA => new ComponentAPageObject(_webDriver);public ComponentBPageObject componentB => new ComponentBPageObject(_webDriver);}
public class ComponentAPageObject
{private IWebDriver _webDriver;public ParentPageObject(IWebDriver webDriver){_webDriver = webDriver;}public IWebElement WebElement => _webDriver.FindElement(By.ClassName("A"));
}public class ComponetBPageObject
{private IWebDriver _webDriver;public ParentPageObject(IWebDriver webDriver){_webDriver = webDriver;}public IWebElement WebElement => _webDriver .FindElement(By.ClassName("B"));
}

相关内容

热门资讯

烟雨红尘小说网的福利 稿费怎么... 烟雨红尘小说网的福利 稿费怎么样烟雨红尘小说网的福利 稿费怎么样 看书的人多吗 订VIP的人多吗 ...
找经常用来形容时光流逝的一首轻... 找经常用来形容时光流逝的一首轻音乐的歌曲蓝色回旋曲(克莱德曼)Yestoday once more昨...
写小说时如何作场景切换? 写小说时如何作场景切换?用写景来连接,由情入景,再由景生情他们在草坪上躺着。 办公室里老师在讨论……...
歇后语有几个 歇后语有几个电线杆子挂暖壶------水平(瓶)高大公鸡吃米——不计其数无数个,随着时间的变化歇后语...
为什么中国人喜欢吃油炸食品? 为什么中国人喜欢吃油炸食品?“最受欢迎”的几种油炸食物,臭豆腐上榜,不知道你最爱吃哪一种?青春期人们...
雷锋名言及故事 雷锋名言及故事雷锋名言及故事一滴水只有放进大海里才永远不会干涸,一个人只有当他把自己和集体事业融合在...
上古王冠无尽深渊梦魔模式打完还... 上古王冠无尽深渊梦魔模式打完还有奖励吗上古王冠无尽深渊梦魔模式打完之后还有奖励有的,上古王冠无尽深渊...
为什么好多人都讨厌下雨天呢?下... 为什么好多人都讨厌下雨天呢?下雨天有什么不好吗?有些人讨厌下雨,有些人喜欢下雨,因为人与人是不一样的...
大风为什么能把茅草屋顶掀开? ... 大风为什么能把茅草屋顶掀开? 物理题大风为什么能把茅草屋顶掀开? 物理题从流体力学上讲,空气流速快的...
科学家发明创造的故事 科学家发明创造的故事以下是 整理的《科学家发明创造的故事》,希望大家喜欢! 1 贝尔,就是发明电...
关于道德的中国古代名人小故事 关于道德的中国古代名人小故事 01 亲尝汤药  汉文帝刘恒,汉高祖第三子,为薄太后所生。高后八年(前...
中华寓言故事的内容简介 中华寓言故事的内容简介 《中华寓言故事》从浩如烟海的寓言王国里,精选了中国文化发展史上的179篇寓言...
男朋友对我说我是不会把你搞丢的... 男朋友对我说我是不会把你搞丢的因为你是在我心里什么意思你朋友说起情话来应该一套一套的。你们的日常对话...
超能世界光之殿堂换了联盟还在吗 超能世界光之殿堂换了联盟还在吗你好,还在的。超能世粗高旁岩橡界光之殿堂退盟10分钟之后就可以加入再加...
如果茅台酒跌破1000元,你还... 几天前,有朋友跟我说,如果茅台酒跌破1500元,我会买20件酒。于是我问他,如果接着跌破1200元呢...
有关友善的故事 有关友善的故事关于友善的三个小故事:中华民族一直以来都崇尚与人为善,以和为贵。在五千年的历史长河中,...
原创 优... 暑期宅家怎么能缺了甜剧?优酷这5部“天花板”级甜剧已就位!高糖剧情+心动CP,从校园到都市,甜度超标...
夏日清凉特调:解锁 4 款神仙... 在炎炎夏日,一杯清凉解暑的甜品不仅能带来味觉上的享受,更能为身心注入一份宁静与治愈。无论是传统的杏皮...
突发!“高端零食第一股”或易主... 7月10日晚间,A股“高端零食第一股”良品铺子(603719.SH)发布公告称,公司控股股东宁波汉意...
AI数字菜谱在蓉首发,“成都造... 滚烫的炒锅上方,机械臂稳健地接过系统指令,精准抓取青椒、肉片,镬气升腾间一份色泽红亮、香气四溢的菜肴...