• PageObject设计模式 在selenium 自动化测试里面的应用


    PageObject设计模式
    1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架。 
    2. web测试时,建议强烈推荐使用_谷歌或_火狐浏览器。
    3. PageObject设计模式:是将某个页面的所有"元素(包含控件)属性"及"元素操作"封装在1个类(Class)里面~~~~
    4. 目的: 测试代码与被测页面对象代码分离,后期如果有页面元素发生了更改,只需要修改相应页面对象的代码(即对应Class文件),而不需要修改测试代码
    5. 尽量采用xpath方式来寻找页面元素,而不建议使用name,Link等方法; xpath是基于页面元素所处区域,一般不会发生变化,测试代码基本不受干扰.
    6. 将页面元素属性信息与代码分离,即与被测对象代码分离,目的也是为了进一步降低后续因页面变化带来的维护成本

    以下是我的一个小的测试实例代码
    Test---java工程名
    src---源代码目录
    CommonObject -----包名--存放公共类代码, 如 UseBrowser.java , 存放的操作chrome,firfox,ie等浏览器的相关代码
    PageObject--------包名--存放页面对象(Page Object),以及相关的操作, 如 HomePageObject.java, 存放百度搜索主页的相关对象及操作方法
    PagePath----------包名--存放页面对象元素的相关路径字符串文件, 如 PageElementPath.java, 存放百度搜索主页对象的路径字符串文件,
    TestCases---------包名--存放页面对象的测试案例的相关类, 如 NewTest.java , 存放的就是真正的测试案例, 调用方法,使用数据进行测试的类.

    复制代码
     1 //公共类,操作浏览器相关的
     2 package CommonObject;
     3 import java.util.concurrent.TimeUnit;
     4 import org.openqa.selenium.WebDriver;
     5 import org.openqa.selenium.chrome.ChromeDriver;
     6 import org.openqa.selenium.firefox.FirefoxDriver;
     7 import org.openqa.selenium.ie.InternetExplorerDriver;
     8 import org.openqa.selenium.remote.DesiredCapabilities;
     9 
    10 public class UseBrowser {
    11     public WebDriver driver;    
    12     //启动谷歌浏览器
    13     public WebDriver setupChrome(String test_url){     
    14     System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
    15     driver = new ChromeDriver();
    16     driver.get(test_url);
    17     driver.manage().window().maximize();
    18     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    19     return driver;
    20     }
    21     //启动火狐浏览器(需要最新geckodriver.exe,放到firfox的根目录)
    22     public WebDriver setupFirfox(String test_url){
    23 //        System.setProperty("webdriver.firefox.marionette","C:/Program Files(x86)/Mozilla Firefox/geckodriver.exe");
    24         driver = new FirefoxDriver();
    25         driver.get(test_url);
    26         driver.manage().window().maximize();
    27         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    28         return driver;
    29     }
    30     //启动IE浏览器
    31     public WebDriver setupIE(String test_url){   
    32      System.setProperty("webdriver.ie.driver", "C:\\Program Files\\Internet Explorer\\IEDriverServer.exe");
    33      DesiredCapabilities dc = DesiredCapabilities.internetExplorer();
    34      dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
    35      driver = new InternetExplorerDriver(dc);
    36      driver.get(test_url);
    37      return driver;
    38     }
    39     //关闭浏览器
    40     public void teardownBrowser(){
    41         driver.close();    
    42     }    
    43 }
    复制代码
    复制代码
    //pageobject页面对象类,百度搜索页面的[输入框],[百度一下按钮]对象及操作
    package PageObject;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import PagePath.PageElementPath;
    
    public class HomePageObject extends PageElementPath{    
        // 点击搜索栏
        public void click_Search_Bar(WebDriver driver){
            driver.findElement(By.id(search_bar_id)).click();
        }        
        // 搜索框输入
        public void input_Search_Box(WebDriver driver,String key_word){        
            driver.findElement(By.id(search_box_id)).clear();
            driver.findElement(By.id(search_box_id)).sendKeys(key_word);
            System.out.println("百度输入框已经成功输入的搜索内容:"+key_word);        
        }    
        //点击搜索按钮(百度一下)
        public void click_Search_Button(WebDriver driver){            
            driver.findElement(By.name(search_button_name)).click();
            System.out.println("click the 百度以下,success...");    
        }
    }
    复制代码
    复制代码
    //页面对象路径类, 百度一下页面的输入框,按钮的路径字符串
    package PagePath;
    
    public class PageElementPath {
        public String search_bar_id = "kw";
        public String search_box_id = "kw";
        public String search_button_name = "wd";
    }
    复制代码
    复制代码
    // 使用testng框架的测试类, 主要进行页面输入框,按钮的测试, 其中的测试数据也可以分离,暂时没有进行分离,
    package TestCases;
    import org.openqa.selenium.WebDriver;
    import org.testng.annotations.Test;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.AfterClass;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeSuite;
    import org.testng.annotations.AfterSuite;
    
    import CommonObject.UseBrowser;
    import PageObject.HomePageObject;
    
    public class NewTest {
        HomePageObject page =new HomePageObject();
        UseBrowser browser = new UseBrowser();
        WebDriver drivers;
        
        
      @Test
      public void test_baidu() throws Exception {
          page.click_Search_Bar(drivers);
          page.input_Search_Box(drivers,"PageObject设计模式");
          Thread.sleep(10000);
          page.click_Search_Button(drivers);
      }
      @BeforeMethod
      public void beforeMethod() {
          System.out.println("Before method success....");
         
      }
    
      @AfterMethod
      public void afterMethod() {
          System.out.println("After Method success....");
      }
    
      @BeforeClass
      public void beforeClass() {
          System.out.println("Before Class success....");
      }
    
      @AfterClass
      public void afterClass() {
          System.out.println("After Class success....");
      }
    
      @BeforeTest
      public void beforeTest() {
          System.out.println("Before Test success....");
      }
    
      @AfterTest
      public void afterTest() {
          System.out.println("After Test success....");
      }
    
      @BeforeSuite
      public void beforeSuite() {
          drivers = browser.setupChrome("http://www.baidu.com/");
          System.out.println("Before Suite success....");
      }
    
      @AfterSuite
      public void afterSuite() {
          browser.teardownBrowser();
          System.out.println("After Suite success....");
      }
    }
    
    /**输入结果为
    Before Suite success....
    Before Test success....
    Before Class success....
    Before method success....
    百度输入框已经成功输入的搜索内容:PageObject设计模式
    click the 百度以下,success...
    After Method success....
    After Class success....
    After Test success....
    After Suite success....
    */
    复制代码
    复制代码
    // 不使用testng框架的情况下, 可以使用java的main方法也可以进行测试.如下面
    package PageObject;
    import org.openqa.selenium.WebDriver;
    import PageObject.HomePageObject;
    import CommonObject.UseBrowser;
    
    public class baidu_main_method{
        
        public static void main(String[]args) throws Exception{
            WebDriver drivers;    
            HomePageObject page = new HomePageObject();
            UseBrowser browser = new UseBrowser();
            
            drivers= browser.setupChrome("http://www.baidu.com/");
            page.click_Search_Bar(drivers);
            page.input_Search_Box(drivers,"PageObject设计模式");
            page.click_Search_Button(drivers);
            Thread.sleep(5000);
            browser.teardownBrowser();
        }
    }
    
    /*
    百度输入框已经成功输入的搜索内容:PageObject设计模式
    click the 百度以下,success...
    */
    复制代码

    什么是POM?
    1. 页面对象模型 是 为Web UI元素创建Object Repository的设计模式 。
    2. 在这个模型下,对于应用程序中的每个网页,应该有相应的页面类。
    3. 此Page类将会找到该Web页面的WebElements,并且还包含对这些WebElements执行操作的页面方法。
    4. 这些方法的名称应该按照他们正在执行的任务给出

    POM的优点
    1. 页面对象Patten表示UI中的操作和流程应与验证分开。这个概念使我们的代码更清洁,易于理解。
    2. 第二个好处是 对象存储库独立于测试用例,因此我们可以使用与不同工具不同的目的使用相同的对象存储库。
    例如,我们可以将POM与用于功能测试的TestNG / JUnit进行集成,并与JBehave / Cucumber同时进行验收测试。
    3. 由于POM类中的可重用页面方法,代码变得更少和优化。
    4. 方法采用更实际的名称 ,可以轻松地映射UI中发生的操作。即如果在点击按钮后,我们登陆主页,方法名称就像'gotoHomePage()'
    如何实现POM?
    简单的POM:
    它是页面对象模型(POM)的基本结构,其中AUT的所有Web元素和在这些Web元素上操作的方法都保留在类文件中。
    类的验证的任务应该作为测试方法的一部分分开

    载于原文:

    https://www.cnblogs.com/xiaofeifei-wang/p/6733753.html

  • 相关阅读:
    android:taskAffinity与android:finishOnTaskLaunch之我见
    Android 实现两屏幕互相滑动
    Android: 如何打开assets or raw文件夹下的数据库文件
    Android自定义进度条
    a标签在ie6下点了没反应
    strtotime 稍有不同
    php遍历时修改 传地址
    css3pie
    js 数据拷贝
    不重启iis的情况下切换iis的.net版本
  • 原文地址:https://www.cnblogs.com/sucretan2010/p/10443672.html
Copyright © 2020-2023  润新知