《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
这是在博客园发布这一系列教程的最后一篇,总共100多篇,后续文章请移步:北京宏哥 的公众号进行阅读和学习,谢谢~或者扫下边的二维码关注公众号进行阅读和学习。
1.简介
上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试。宏哥将这个叫做浏览器引擎类。这个类负责获取浏览器类型和启动不同浏览器,并做一些前提操作,例如:最大化浏览器窗口和,打开测试服务器地址。
今天这篇宏哥打算介绍如何封装几个Selenium公共的方法到页面基类中去。首先宏哥给小伙伴或者童鞋们解释一下页面基类,看到基类,我们想起了继承。没错,在这个框架基于POM的思想上,我们需要利用继承的特点,来实现,减少我们重复代码量。
2.为什么要定义一个页面基类呢?
我们已经知道或者了解POM,前边开头也介绍过,我们每个模块或者相关功能,都能在一个个页面类上去定义和写相关业务操作方法。但是由于很多页面,我们有些方法是相同的,例如:判断一个元素是否在页面显示,还有元素点击和输入操作,还有判断页面标题和页面地址等等,甚至,有些软件web不同页面有公共的元素。这些因素,决定了我们需要写一个页面父类,来定义一些公共的方法或者公共的元素,宏哥将这个页面父类称之为页面基类。
3.Selenium方法的二次封装
1.先按照如下图,创建一个BasePage的类,如下图所示:
2.将selenium的方法进行二次封装,这个类就叫页面基类。这个叫页面基类,以后POM里面每个页面新写的类都需要继承这个BasePage类。如下图所示:
3.BasePage的代码内容参考如下:
package framework; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; /** * @author 北京-宏哥 * * @公众号:北京宏哥 * * 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程) * * 2022年4月29日 */ public class BasePage { public static WebDriver driver; public static String pageTitle; public static String pageUrl; /* * 构造方法 */ protected BasePage(WebDriver driver) { BasePage.driver = driver; } /* * 在文本框内输入字符 */ protected void type(WebElement element, String text) { try { if (element.isEnabled()) { element.clear(); Logger.Output(LogType.LogTypeName.INFO, "Clean the value if any in " + element.toString() + "."); element.sendKeys(text); Logger.Output(LogType.LogTypeName.INFO, "Type value is: " + text + "."); } } catch (Exception e) { Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); } } /* * 点击元素,这里指点击鼠标左键 */ protected void click(WebElement element) { try { if (element.isEnabled()) { element.click(); Logger.Output(LogType.LogTypeName.INFO, "Element: " + element.toString() + " was clicked."); } } catch (Exception e) { Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); } } /* * 在文本输入框执行清除操作 */ protected void clean(WebElement element) { try { if (element.isEnabled()) { element.clear(); Logger.Output(LogType.LogTypeName.INFO, "Element " + element.toString() + " was cleaned."); } } catch (Exception e) { Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); } } /* * 判断一个页面元素是否显示在当前页面 */ protected void verifyElementIsPresent(WebElement element) { try { if (element.isDisplayed()) { Logger.Output(LogType.LogTypeName.INFO, "This Element " + element.toString().trim() + " is present."); } } catch (Exception e) { Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); } } /* * 获取页面的标题 */ protected String getCurrentPageTitle() { pageTitle = driver.getTitle(); Logger.Output(LogType.LogTypeName.INFO, "Current page title is " + pageTitle); return pageTitle; } /* * 获取页面的url */ protected String getCurrentPageUrl() { pageUrl = driver.getCurrentUrl(); Logger.Output(LogType.LogTypeName.INFO, "Current page title is " + pageUrl); return pageUrl; } }
从上面代码看到:宏哥实现了Selenium的元素判断是否显示,和元素清除,点击,输入等方法的二次封装。还有我们写了每个页面都存在的获取标题和url的方法。其他的方法,宏哥先不全部放上去进行封装,以后宏哥会慢慢完善BasePage这个基类。接下来,宏哥就需要在实现POM里去测试这个页面基类是否能够正常使用。
4.测试页面基类
4.1测试场景
宏哥就在这里用一个简单的测试场景:打开浏览器访问百度首页,然后在搜索框中输入“北京-宏哥”,最后点击“百度一下”按钮。测试场景简单这里测试用例就不再赘述了,直接进入主题:测试页面基类是否可以正常使用。
4.2代码设计
1.在pageObject包中,创建一个BaiduSearchPage类,如下图所示:
2.在testSuit包中,创建一个测试类:testBasePage,如下图所示:
4.3参考代码
(1)BaiduSearchPage.java
package pageObject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import framework.BasePage; /** * @author 北京-宏哥 * * @公众号:北京宏哥 * * 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程) * * 2022年4月29日 */ public class BaiduSearchPage extends BasePage{ /* * 百度的首页,主要提供一些其他子模块或者页面的入口,一般点击一个元素,进入下一页面 */ /** * @param driver */ public BaiduSearchPage(WebDriver driver) { super(driver); // TODO Auto-generated constructor stub } // 元素定位 //搜索输入框 @FindBy (id="kw") WebElement search_inputBox; //搜索提交按钮 @FindBy (id="su") WebElement search_submitBtn; /* * 搜索框输入关键字,点击搜索 */ public void searchWithKeyword(String keyword){ //继承页面基类里的输入和点击方法 type(search_inputBox, keyword); click(search_submitBtn); } }
(2)testBasePage.java
package testSuite; import java.io.IOException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import pageObject.BaiduSearchPage; import framework.BrowserEngine; /** * @author 北京-宏哥 * * @公众号:北京宏哥 * * 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程) * * 2022年4月09日 */ public class testBasePage { public WebDriver driver; @BeforeClass public void setUp() throws IOException{ BrowserEngine browserEngine = new BrowserEngine(); browserEngine.initConfigData(); driver=browserEngine.getBrowser(); } @Test public void search() throws InterruptedException{ BaiduSearchPage searchpage = PageFactory.initElements(driver, BaiduSearchPage.class); Thread.sleep(5000); searchpage.searchWithKeyword("北京-宏哥"); } @AfterClass public void tearDown() throws InterruptedException{ Thread.sleep(5000); driver.quit(); } }
4.4运行代码
1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:
2.运行代码后电脑端的浏览器的动作,如下小视频所示:
5.小结
注意了,敲黑板!!!!在写代码的过程中 ,一个小问题耽误了好久,那就在类中,宏哥将那个super的方法给定义成protected的,这个是由于eclipse自带提示宏哥就默认了,没有想到是会影响后边的调用。结果一直报错如下:
解决办法:修改成public就可以了。
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
公众号(关注宏哥)                                                                                 客服微信