如何生成页面对象模式类(SeleniumQA)以测试Web/移动页面
什么是NEOPageFactory?
SeleniumQAPageFactory简介
SeleniumQAPageFactory是一个众所周知的实用程序,使开发人员和测试人员可以基于PageObjectPattern实施自动化的Web/移动测试。简而言之,所有要测试的页面都单独(1:1)映射到物理(Java,C#.NET,...)页面测试类。页面测试类的实例称为PageObject。此对象通常用于通过编程方式与被测页面进行交互,例如,通过自动填写表单。
页面对象包含用于表示 被测页面的页面元素的获取器和设置器。这些获取器/设置器通常用于 设置 数据/从这些元素获取数据。该类中还有一些方法可以触发物理页面事件,例如click,doubleClick等。
使用SeleniumQAPageFactory时的问题
开箱即用地使用SeleniumQAPageFactory,所有页面类都由测试人员(或开发人员)手动创建。这通常会导致复杂化,尤其是在被测页面中包含大量页面元素的情况下(例如,页面上的元素数量非常多的情况)。从测试人员的角度来看,问题也可能在开发的初始阶段出现,在这种情况下,开发人员经常更改元素ID,名称,xpath的位置等(尤其是在预期不会发生这些更改时)。
使用NEOPageFactory可以最小化SeleniumQA问题
开发NEOPageFactory的目的是(至少)最大程度地减少这些问题。通过 进一步执行此操作,并生成用于所有测试的所有页面类,可以做到这一点。 这是。减少了创建页面类的时间(因为这些类可以在测试中直接使用),并且还可以在UNIT测试阶段为每个构建使用,作为页面类生成之间的区别。后者变得非常有用,因为它在验收测试阶段(通常是通常发现页面修改问题的阶段)将(开发页面修改)问题最小化。
它是如何工作的?
NeoPageFactory的工作方式是扫描所有HTML文档(通过HTTP或本地HTML文本文件)以查找标准(或量身定制)元素,例如input,a,select等,并根据发现的元素生成包含getter和这些获取器/设置器(以及操作方法,例如click,doubleClick等)表示找到的元素。每种方法的命名惯例由其元素ID,名称或用于显示该元素的文本确定。
用法
1.克隆并安装neopagefactory
(注意:此步骤只需执行一次)
# Assuming your root workspace for all projects is ~/projectscd ~/projects# Clone NEO PageFactory ...git clone https://github.com/desmccarter/neopagefactory# Go into the newly created/cloned folder ...cd neopagefactory# Install ...mvn clean install1234567891011复制代码类型:[java]
2.生成您的POP(页面对象模式)类
# Assuming your project workspace is ~/projects/myproject# and that you are working in a BASH instance ...# Go to YOUR test project foldercd ~/project/myproject# Generate Google.com (for example) Page Object Pattern classes# for your project ...~/project/nopagefactory/generateclasses -url https://www.google.com12345678910复制代码类型:[java]
页面类输出
页面类(默认情况下)是在当前工作目录中src/main/java/com/dmcc/sample/pages下创建的。命名约定为NameOf PagePage.java,其中 NameOfPage 由URL名称组成。例如,从www.google.com生成的页面类的名称为src/main/java/com/dmcc/sample/pages/google下的GooglePage.java。
NEOPageFactory生成的示例类
显示的以下页面类是从NEOPageFactory生成的。
Google.com
package com.dmcc.sample.pages.google;import com.dmcc.pagegen.exceptions.PageException;import com.dmcc.sample.pages.google.GoogleField;import com.dmcc.pagegen.page.mccarterp.McCarterPage;public class GooglePage extends McCarterPage{private final String url="https://www.google.com";private final String rRoot="../pgenexamples/src/test/resources";public GooglePage navigate()throws PageException {this.setResourcesRoot(rRoot);this.navigate(url);return this;}public void setQ(final String value) throws PageException{this.setValue(GoogleField.Q, value);}public void clickQ()throws PageException{this.click(GoogleField.Q);}public void clickGoogleSearch()throws PageException{this.click(GoogleField.GoogleSearch);}public void clickIMFeelingLucky()throws PageException{this.click(GoogleField.IMFeelingLucky);}}123456789101112131415161718192021222324252627282930313233复制代码类型:[java]
Facebook.com
package com.dmcc.sample.pages.facebook;import com.dmcc.pagegen.exceptions.PageException;import com.dmcc.sample.pages.facebook.FacebookField;import com.dmcc.pagegen.page.mccarterp.McCarterPage;public class FacebookPage extends McCarterPage{private final String url="https://www.facebook.com";private final String rRoot="../pgenexamples/src/test/resources";public FacebookPage navigate()throws PageException {this.setResourcesRoot(rRoot);this.navigate(url);return this;}public void setEmail(final String value) throws PageException{this.setValue(FacebookField.Email, value);}public void clickEmail()throws PageException{this.click(FacebookField.Email);}public void setPass(final String value) throws PageException{this.setValue(FacebookField.Pass, value);}public void clickPass()throws PageException{this.click(FacebookField.Pass);}public void clickLogIn()throws PageException{this.click(FacebookField.LogIn);}public void setFirstname(final String value) throws PageException{this.setValue(FacebookField.Firstname, value);}public void clickFirstname()throws PageException{this.click(FacebookField.Firstname);}public void setLastname(final String value) throws PageException{this.setValue(FacebookField.Lastname, value);}public void clickLastname()throws PageException{this.click(FacebookField.Lastname);}public void setRegEmail(final String value) throws PageException{this.setValue(FacebookField.RegEmail, value);}public void clickRegEmail()throws PageException{this.click(FacebookField.RegEmail);}...12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061复制代码类型:[java]
Lastminute.com
package com.dmcc.sample.pages.lastminute;import com.dmcc.pagegen.exceptions.PageException;import com.dmcc.sample.pages.lastminute.LastminuteField;import com.dmcc.pagegen.page.mccarterp.McCarterPage;public class LastminutePage extends McCarterPage{private final String url="https://www.lastminute.com";private final String rRoot="../pgenexamples/src/test/resources";public LastminutePage navigate()throws PageException {this.setResourcesRoot(rRoot);this.navigate(url);return this;}public void setDpSearchFrom(final String value) throws PageException{this.setValue(LastminuteField.DpSearchFrom, value);}public void clickDpSearchFrom()throws PageException{this.click(LastminuteField.DpSearchFrom);}public void setDpSearchTo(final String value) throws PageException{this.setValue(LastminuteField.DpSearchTo, value);}public void clickDpSearchTo()throws PageException{this.click(LastminuteField.DpSearchTo);}public void setDpCheckIn(final String value) throws PageException{this.setValue(LastminuteField.DpCheckIn, value);}public void clickDpCheckIn()throws PageException{this.click(LastminuteField.DpCheckIn);}public void setDpCheckOut(final String value) throws PageException{this.setValue(LastminuteField.DpCheckOut, value);}public void clickDpCheckOut()throws PageException{this.click(LastminuteField.DpCheckOut);}public void setGoingTo(final GoingToEnum value) throws PageException{this.setValue(LastminuteField.GoingTo, value.toString());}public void clickGoingTo()throws PageException{this.click(LastminuteField.GoingTo);}public void setLeavingFrom(final LeavingFromEnum value) throws PageException{this.setValue(LastminuteField.LeavingFrom, value.toString());}public void clickLeavingFrom()throws PageException{this.click(LastminuteField.LeavingFrom);}}