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"));
}

相关内容

热门资讯

80年代国产经典谍战电视剧 80年代国产经典谍战电视剧故事背景为1921~~1959年抗日战争、解放战争、解放后初期的谍战类电影...
绍兴名人的传说 绍兴名人的传说看你要谁的了 绍兴名人多的很呢
《他在云之南》是真实事件吗? 《他在云之南》是真实事件吗? 《他在云之南》不是真实事件。《他在云之南》作者:景行,本文于2017年...
谁知道黄鹤楼的传说(简短一点) 谁知道黄鹤楼的传说(简短一点)有谁知道黄鹤楼的传说?急啊!!!江夏郡辛氏卖酒。有一先生飘然而来,衣甚...
描写夏天的小诗歌 描写夏天的小诗歌夏天来临,大地一片生机盎然,阳光照耀,草木欣欣向荣,蝉鸣声声,花香四溢, 微风习习,...
大学生的恋爱是不是越来越快餐化... 大学生的恋爱是不是越来越快餐化?作为一名目睹了身边朋友分分合合的大学生来说,是的,大学生的恋爱确实越...
李白是怎样被唐玄宗重用的,而后... 李白是怎样被唐玄宗重用的,而后又为何辞官回家?天宝初年,李白游历到会稽一带,与当地才子吴筠十分要好,...
什么是无限方块呢?有人了解吗? 什么是无限方块呢?有人了解吗?无限方块也是魔方的一种,是由VIVARISE推出的产品,这款无限方块产...
想要一个个性签名 想要一个个性签名我是一名财务 常常要签字 所以想要一个适合好看的艺术签名 我叫徐小红,请动这个...
诉求5句“成功没有捷径”的名人... 诉求5句“成功没有捷径”的名人名言?用来套作文地~!眼下我们面对的是一个竞争激烈的社会,竞争就有变易...
用自己的话讲一个西游记里的故事... 用自己的话讲一个西游记里的故事, 三百字以内就行。唐僧和他的宠物们打怪升级,终于the end,从此...
上虞的民间故事 上虞的民间故事 上虞的民间故事有哪些啊,越多越好,要有故事情节哦,先谢了 1、沥海的由来 相传很久很...
有关自然之道的故事(急急急急急... 有关自然之道的故事(急急急急急急急急急)关自道故事(急急急急急急急急急急急急急急) 要简短点(急啊急...
千里因缘 千里因缘千里因缘可能性有多大?很大,很大。。。到阿启命理网站机会说大,即不大。说小也不小。有缘千里来...
全职猎人:最后的任务 全职猎人:最后的任务全职猎人:最后的任务 几时有得看阿。。。。。。那边都出了 这边怎么还没有的估计...
香港九龙寨名人? 香港九龙寨名人?有十大名人:1何香凝2王宠惠3何东4李惠堂5何鸿章6何甘棠7赵一获8邹文怀9容国团1...
苏州杜村 苏州杜村杜村是苏州还是上海的啊,要怎么剩车?那里做手工活的多吗?是渡村吧,连名字都不清楚怎么找啊,你...
乒乓球手抄报 乒乓球手抄报乒乓球手抄报 乒乓宏粗派球凳丛手蔽贺抄报
汗不敢出文言文兄弟俩的性格特点 汗不敢出文言文兄弟俩的性格特点 钟毓诚实,行为拘束;钟会聪慧机灵,说话口齿伶俐。汗不敢出是指魏...
蒸汽眼罩真的能让眼睛更加明亮吗... 蒸汽眼罩真的能让眼睛更加明亮吗?像这样的蒸汽眼罩,每天坚持半个小时,可以让眼睛特别的明亮,眼睛会变得...