• 章节十五、2-PageObjectModel


    一、在实现自动化过程中,会有很多重复的代码,我们在维护代码时会很困难,如果想解决这个问题,我们就需要使用PageObjectModel(页面对象模型)的方式来进行自动化代码的书写。

    二、案例演示

    以该网站的机票预订操作为例:https://www.expedia.com/?siteid=100001&langid=2052&currency=CNY

    1、首先我们在eclipse中创建2个包,pageclasses和pomtestcase,然后在pageclasses中创建一个用于存放单个元素的类SearchPage,在pomtestcase中创建一个类用于调用创建好的元素,这样就能够把页面元素和测试的用例代码分开存放,便于维护和调用。

    2、在SearchPage类中将查找元素直接封装到方法中

    package pageclasses;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    
    public class SearchPage {
        
    //    首先声明一个WebElement类型的变量
        public static WebElement element = null ;
        
    //    加元素封装到方法中
        
        /**
         * 返回"机票按钮"元素
         * @param driver
         * @return
         */
         public static WebElement ticketButton(WebDriver driver) {
             element = driver.findElement(By.id("tab-flight-tab-hp"));
             return element;
         }
    
         /**
             * 返回"出发文本框"元素
             * @param driver
             * @return
             */
             public static WebElement startText(WebDriver driver) {
                 element = driver.findElement(By.xpath("//input[@id='flight-origin-hp-flight']"));
                 return element;
             }
             
        /**
            * 返回"飞往文本框"元素
            * @param driver
            * @return
            */
            public static WebElement endText(WebDriver driver) {
                element = driver.findElement(By.xpath("//input[@id='flight-destination-hp-flight']"));
                return element;
            } 
                 
        /**
            * 返回"出发日期框"元素
            * @param driver
            * @return
            */
            public static WebElement startData(WebDriver driver) {
                element = driver.findElement(By.xpath("//input[@id='flight-departing-hp-flight']"));
                return element;
            } 
                     
        /**
            * 返回"返回日期框"元素
            * @param driver
            * @return
            */
            public static WebElement returnData(WebDriver driver) {
                element = driver.findElement(By.xpath("//input[@id='flight-returning-hp-flight']"));
                return element;
            } 
                         
        /**
            * 返回"点击登录"元素
            * @param driver
            * @return
            */
            public static WebElement searchButton(WebDriver driver) {
                element = driver.findElement(By.xpath("//div[@class='cols-nested ab25184-submit']//button[@class='btn-primary btn-action gcw-submit']"));
                return element;
            } 
    }

    元素封装好以后,在测试类中可以直接被多出重复调用,但前端代码路径发生变化,那么就只需要修改该类中相对应的元素路径即可,测试类中调用到该元素的路径也一并进行了修改,提高了我们对自动化代码维护时的工作效率。

    3、在PageObjectModel类中直接调用,这样就简化了测试类中的代码量

     1 package pomtestcase;
     2 
     3 import static org.junit.jupiter.api.Assertions.*;
     4 
     5 import java.util.concurrent.TimeUnit;
     6 
     7 import org.junit.jupiter.api.AfterEach;
     8 import org.junit.jupiter.api.BeforeEach;
     9 import org.junit.jupiter.api.Test;
    10 import org.openqa.selenium.By;
    11 import org.openqa.selenium.WebDriver;
    12 import org.openqa.selenium.chrome.ChromeDriver;
    13 
    14 import pageclasses.SearchPage;
    15 
    16 class PageObjectModel {
    17 
    18     WebDriver driver;
    19     String url;
    20     
    21     @BeforeEach
    22     void setUp() throws Exception {
    23         driver = new ChromeDriver();
    24         url = "https://www.expedia.com/?siteid=100001&langid=2052&currency=CNY";
    25         driver.manage().window().maximize();
    26         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    27         driver.get(url);
    28     }
    29 
    30     @Test
    31     void test() throws InterruptedException {
    32 //        调用封装了元素的SearchPage类中的“机票”按钮元素
    33         SearchPage.ticketButton(driver).click();
    34         Thread.sleep(1000);
    35 //        调用封装了元素的SearchPage类中的“出发”输入框元素
    36         SearchPage.startText(driver).sendKeys("长沙, 中国 (CSX-黄花国际机场)");
    37         Thread.sleep(1000);
    38 //        调用封装了元素的SearchPage类中的“返回”输入框元素
    39         SearchPage.endText(driver).sendKeys("上海, 中国 (PVG-浦东国际机场)");
    40 //        调用封装了元素的SearchPage类中的“出发”日期输入框元素
    41         SearchPage.startData(driver).sendKeys("2019/07/06");
    42 //        调用封装了元素的SearchPage类中的“返回”日期输入框元素
    43         SearchPage.returnData(driver).sendKeys("2019/07/07");
    44 //        调用封装了元素的SearchPage类中的“搜索”按钮元素
    45         SearchPage.searchButton(driver).click();
    46     }
    47     
    48     @AfterEach
    49     void tearDown() throws Exception {
    50         Thread.sleep(2000);
    51         driver.quit();
    52     }
    54 }

    三、在“案例演示”中我们只封装了查找元素的方法,但为了调用方便,我们可以将输入动作或者点击动作一并进行封装,进一步简化测试类中的代码量

    将“出发地”文本框元素输入进行封装:

    封装后调用:

    如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

    内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

    欢迎关注,转载请注明来源。

  • 相关阅读:
    线程池原理分析
    强引用-软引用-弱引用
    并发编程之多线程
    linux关于获取时间的几个函数
    gdb安装和使用
    c++四种显式类型转换
    ARP协议
    Vmware 共享文件夹不显示的问题
    gdb基本使用
    动态二维数组实现
  • 原文地址:https://www.cnblogs.com/luohuasheng/p/11128004.html
Copyright © 2020-2023  润新知