专栏首页企鹅号快讯WebDriver自动化项目设计模式快速入门-自动化测试系列笔记

WebDriver自动化项目设计模式快速入门-自动化测试系列笔记

朵拉小序:Page Object,即”页面对象“,就是将单个页面作为一个对象来处理。

以面向对象的方式来处理页面和业务流程的好处在于,如果某个页面元素的属性有了变化,只需在包含这个元素的页面对象中调整操作该元素的属性或方法即可。

若有大量重复代码,且开发修改一个页面的一个元素属性后,那自动化测试需要修改调整的工作量会 成倍增加。

解决这种问题,可采用面向对象的方式来处理页面之间的交互。将单个页面上的页面元素和相应操作封装到一个页面对象中。即Page Object。

一、page Object

首先,明确基本页面,以及它们之间的切换。

1.LoginPage

登录页包括:用户名输入框 密码输入框 登录按钮

//定义3个WebElement属性,用于记录用户名、密码、登录

public class LoginPage1 {

WebDriver driver;

WebElement username;

WebElement password;

WebElement loginbutton;

public LoginPage1(WebDriver driver) {

this.driver = driver;

username = driver.findElement(By.id("tbUserName"));

password = driver.findElement(By.id("tbPassword"));

loginbutton = driver.findElement(By.id("btnLogin"));

}

//定义1个login()方法,用于发送用户名和密码并登录网站。

public void login(String userName, String passWord) {

username.sendKeys(userName);

password.sendKeys(passWord);

loginbutton.click();

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

}

}

2.LogoutPage

public class LogoutPage {

WebDriver driver;

// 在构造函数中记录WebDriver

public LogoutPage(WebDriver driver) {

this.driver = driver;

}

// 定义logout()方法,封装弹出框的处理细节,包括显式等待弹出框的出现,及确认退出。

public void logout() {

WebDriverWait wait = new WebDriverWait(driver, 300);

wait.until(ExpectedConditions.alertIsPresent());

driver.switchTo().alert().accept();

}

}

----------------------------------------------------

以下是case代码,可以看到:在采用Page Object方式的面向对象机制后,case代码的逻辑更清晰。

public class TestMessageWithPageObject1 {

// 完整测试用例代码

public static void main(String[] args) {

WebDriver driver = new FirefoxDriver();

// 构造MainPage的实例对象

MainPage1 mainPage = new MainPage1(driver);

// 构造Page2的实例对象

MessagePage messagePage = new MessagePage(driver);

// 打开主页并登录,然后发送消息后退出登录状态

mainPage.login("zh_webdriver", "webdriver_1");

messagePage.sendMessage("zh_webdriver", "testSendingMessage1", "text message1");

messagePage.sendMessage("zh_webdriver", "testSendingMessage2", "text message2");

mainPage.logout();

// 再次打开测试主页并登录,后发送消息并删除所有消息,然后退出

mainPage.login("zh_webdriver", "webdriver_1");

messagePage.sendMessage("zh_webdriver", "testSendingMessage3", "text message3");

messagePage.deleteAllMessage();

mainPage.logout();

driver.quit();

}

}

------------

二、使用Page Object、Page Factory、@FindBy和 How

Page Factory、@FindBy和 How数组就是WebDriver专门提供给用户以更好地利用Page Object方式。可以称为加强版的Page Object机制。

且使得测试代码的逻辑更清晰 ,维护起来更方便。

How数组支持的页面元素包括如下类型:

ID

ID_ OR_NAME

CSS

NAME

CLASS_NAME

LINK_TEXT

PARTIAL_LINK_TEXT

TAG_NAME

XPATH

---------------------------

LoginPage2

public class LoginPage2 {

WebDriver driver;

//在页面中的任意一个页面元素都可以使用@FindBy注解来进行标记。@ FindBy可用于替换driver.findElement()方法的查找机制来定位页面元素。

//同时使用How数组来替换By的作用。

@FindBy(how = How.ID,id = "input1")

WebElement username;

@FindBy(how = How.ID,id = "input2")

WebElement password;

@FindBy(how =How.ID,id = "btnLogin")

WebElement loginbutton;

public LoginPage2(WebDriver driver){

this.driver = driver;

}

public void login(String userName,String passWord){

username.sendKeys(userName);

password.sendKeys(passWord);

loginbutton.click();

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

}

}

LogoutPage2

public class LogoutPage2 {

WebDriver driver;

public LogoutPage2(WebDriver driver) {

this.driver = driver;

}

public void logout() {

WebDriverWait wait = new WebDriverWait(driver, 300);

wait.until(ExpectedConditions.alertIsPresent());

driver.switchTo().alert().accept();

}

}

MainPage2

import java.util.*;

public class MainPage2 {

// PageFactory会替换传统的通过new来实例化对象的方式。

WebDriver driver;

// 采用@FindBy和How数组来替换driver.findElement()方法

@FindBy(how = How.LINK_TEXT, linkText = "登录")

WebElement loginLink;

@FindBy(how = How.LINK_TEXT, linkText = "退出")

WebElement logoutLink;

public MainPage2(WebDriver driver) {

this.driver = driver;

}

public void openMainPage(String url) {

driver.get(url);

driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS);

}

public void login(String userName, String passWord) {

loginLink.click();

WebDriverWait wait = new WebDriverWait(driver, 300);

wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("input1")));

LoginPage2 loginPage = PageFactory.initElements(driver, LoginPage2.class);

loginPage.login(userName, passWord);

}

public void logout() {

logoutLink.click();

// 此处移除了driver.findElement()方法,用PageFactory.initElements()方法替换了之前传统的logoutPage的对象实例化方法,并将driver实例传递给对象

LogoutPage2 logoutPage = PageFactory.initElements(driver, LogoutPage2.class);

logoutPage.logout();

}

}

case代码:

public class TestMessageWithPageObject2 {

public static void main(String... args) throws InterruptedException {

WebDriver driver = new FirefoxDriver();

// 区别:MainPage与MessagePage的实例化均由PageFactory.initElements()方法替换了。

MainPage2 mainPage = PageFactory.initElements(driver, MainPage2.class);

MessagePage2 messagePage = PageFactory.initElements(driver, MessagePage2.class);

//打开主页

mainPage.login("zh_webdriver", "webdriver_1");

Thread.sleep(2000);

mainPage.login("zh_webdriver", "webdriver_1");

messagePage.sendMessage("zh_webdriver", "testSendingMessage3", "text message3");

messagePage.deleteAllMessage();

mainPage.logout();

driver.quit();

}

}

备注:因本地代码较多,笔记中只贴出部分Demo代码 ,全部代码稍后会统一整理在云盘中。

本文来自企鹅号 - 木蚂蚁媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux后门整理合集

    UnixBash 远控后门 简介 利用 Unix/Linux 自带的 Bash 和 Crond 实现远控功能,保持反弹上线到公网机器。 利用方法 先创建 /et...

    企鹅号小编
  • 2018 年初值得关注的 25 个新 Android 库和项目

    协作翻译 原文:25 new Android libraries and projects to check at the beginning of 2018 ...

    企鹅号小编
  • 使用10几行Python代码,快速建立视觉模型识别图像

    视觉 进化的作用,让人类对图像的处理非常高效。 这里,我给你展示一张照片。 ? 如果我这样问你: 你能否分辨出图片中哪个是猫,哪个是狗? 你可能立即会觉得自己遭...

    企鹅号小编
  • python+Selenium自动化测试——输入,点击操作

    打开百度首页,搜索“胡歌”,然后检索列表,有无“胡歌的新浪微博”这个链接 2、在写脚本之前,需要明确测试的步骤,具体到每个步骤需要做什么,既拆分测试场景,考虑好...

    砸漏
  • selenium2java造数据例子

    本人在学习selenium2java的时候,有个功能,需要测试分页,每页20条数据,一个个添加太麻烦了,关键每条都得添加十几个数据,干脆自己写了一个方法,自动添...

    FunTester
  • 《selenium2 python 自动化测试实战》(15)——调用js控制滚动条等操作

    用户2149234
  • Python+Selenium笔记(十二):数据驱动测试

    (一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化。(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用d...

    free赖权华
  • selenium获取缓存数据

    小小咸鱼YwY
  • nginx0.1.0之event模块初始化源码分析(3)

    前面已经分析了event初始化的整体流程和第一步create_conf,接下来看一下第二步ngx_conf_parse。这里不分析该函数的代码,该函数主要是遍历...

    theanarkh
  • 使用scikit-learn解释随机森林算法

    在以前的一篇博文里,我讨论过如何将随机森林算法转化为一个“白盒”,这样每次预测就能被分解为各项特征的贡献和,即 ? 我多次想找相关的代码。然而,绝大多数的随机森...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券