一、在实现自动化过程中,会有很多重复的代码,我们在维护代码时会很困难,如果想解决这个问题,我们就需要使用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基础开始。

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

posted on 2019-07-05 16:29  时光以北暮南城  阅读(479)  评论(2编辑  收藏  举报