Intellij IDEA + Maven + Cucumber 项目 (四):使用自动化测试的Page对象模式

在BaiduSearchStepfs.java 文件中,我们可看到都是直接用driver对页面进行操作。对于我们刚开始学习来说,这样没问题。但是随着项目的运行,页面多了以后。我们写的用例也多了以后,当开发改变某个页面元素后,那我们需要修改代码的工作量将是非常多。所以如果我们能够用Page模式来管理各个页面,那后面页面元素有改变的话,我们只需要改下具体某个页面的Eelement就可以了

1、创建一个类来启动driver

写一个类,用于启动并设置driver各个属性等

在目录test的子目录cucumber下新建utl目录,并在该目录下新建一个类SharedDriver.java

在类SharedDriver.java输入下面内容:

 

[java] view plain copy
 
  1. import com.cucumber.config.ConfigManager;  
  2. import cucumber.api.Scenario;  
  3. import cucumber.api.java.After;  
  4. import cucumber.api.java.Before;  
  5. import org.openqa.selenium.OutputType;  
  6. import org.openqa.selenium.WebDriver;  
  7. import org.openqa.selenium.WebDriverException;  
  8. import org.openqa.selenium.remote.DesiredCapabilities;  
  9. import org.openqa.selenium.remote.RemoteWebDriver;  
  10. import org.openqa.selenium.support.events.EventFiringWebDriver;  
  11.   
  12. import java.net.MalformedURLException;  
  13. import java.net.URL;  
  14. import java.util.concurrent.TimeUnit;  
  15.   
  16. public class SharedDriver extends EventFiringWebDriver {  
  17.     private static WebDriver REAL_DRIVER = null;  
  18.     private static final Thread CLOSE_THREAD = new Thread() {  
  19.         @Override  
  20.         public void run() {  
  21.             REAL_DRIVER.close();  
  22.         }  
  23.     };  
  24.   
  25.     static {  
  26.         Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);  
  27.         ConfigManager config = new ConfigManager();  
  28.   
  29.         DesiredCapabilities browser = null;  
  30.   
  31.         if ("firefox".equalsIgnoreCase(config.get("browser"))) {  
  32.             browser = DesiredCapabilities.firefox();  
  33.         } else {  
  34.             browser = DesiredCapabilities.chrome();  
  35.         }  
  36.         browser.setJavascriptEnabled(true);  
  37.   
  38.         try {  
  39.   
  40.             REAL_DRIVER = new RemoteWebDriver(new URL(config.get("selenium_server_url")), browser);  
  41.         } catch (MalformedURLException exceptions) {  
  42.   
  43.         }  
  44.     }  
  45.   
  46.     public SharedDriver () {  
  47.         super(REAL_DRIVER);  
  48.         REAL_DRIVER.manage().window().maximize();  
  49.         REAL_DRIVER.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);  
  50.     }  
  51.   
  52.     @Override  
  53.     public void close() {  
  54.         if (Thread.currentThread() != CLOSE_THREAD) {  
  55.             throw new UnsupportedOperationException("You shouldn't close this WebDriver. It's shared and will close when the JVM exits.");  
  56.         }  
  57.         super.close();  
  58.     }  
  59.   
  60.     @Before  
  61.     public void deleteAllCookies() {  
  62.         REAL_DRIVER.manage().deleteAllCookies();  
  63.     }  
  64.   
  65.     @After  
  66.     public void embedScreenshot(Scenario scenario) {  
  67.         try {  
  68.             byte[] screenshot = getScreenshotAs(OutputType.BYTES);  
  69.             scenario.embed(screenshot, "image/png");  
  70.   
  71.         } catch (WebDriverException somePlatformsDontSupportScreenshots) {  
  72.             System.err.println(somePlatformsDontSupportScreenshots.getMessage());  
  73.         }  
  74.     }  
  75. }  

 

上面代码要引用另外一个类ConfigManager.java ,该类用来查找一些配置等
在目录test的子目录cucumber下新建config目录,并在该目录下新建一个类ConfigManager.java


在类ConfigManager.java输入下面内容:

 

[java] view plain copy
 
  1. public class ConfigManager {  
  2.   
  3.     private static Properties defaultProperties = null;  
  4.   
  5.     static {  
  6.         defaultProperties = new Properties();  
  7.         try {  
  8.             defaultProperties.load(new FileReader("config/default.properties"));  
  9.             File customConfigFile = new File("config/custom.properties");  
  10.             if (customConfigFile.exists()) {  
  11.                 defaultProperties.load(new FileReader(customConfigFile));  
  12.             }  
  13.         } catch (IOException exception) {  
  14.             System.err.println("未找到配置文件");  
  15.         }  
  16.   
  17.         if (!defaultProperties.isEmpty()) {  
  18.             for (Object key : defaultProperties.keySet()) {  
  19.                 if (System.getProperty((String)key) != null) {  
  20.                     defaultProperties.setProperty((String)key, System.getProperty((String)key));  
  21.                 }  
  22.             }  
  23.         }  
  24.     }  
  25.   
  26.     public ConfigManager() {  
  27.     }  
  28.   
  29.     public String get(String key) {  
  30.         return defaultProperties.getProperty(key);  
  31.     }  
  32. }  

之后在项目下,新建目录config,并创建两个文件custom.properties(自己用的配置文件,可以随意修改) 和 default.properties(可以留作后面团队整体运行测试时用)

两个文件的内容可以一样,如下所示

 

[plain] view plain copy
 
  1. selenium_server_url = http://127.0.0.1:4444/wd/hub  
  2. browser = chrome  
  3.   
  4. base_path = http://www.baidu.com  

 

2、创建一个Page来封装百度首页

 

在目录main下新建一个目录com, 并在该目录下新建一个类BaiduHome_page.java。该类用来封装百度首页


在类BaiduHome_page.java输入下面内容:

 

[java] view plain copy
 
  1. import org.openqa.selenium.WebDriver;  
  2. import org.openqa.selenium.WebElement;  
  3. import org.openqa.selenium.support.FindBy;  
  4. import org.openqa.selenium.support.PageFactory;  
  5. import org.openqa.selenium.support.ui.ExpectedConditions;  
  6. import org.openqa.selenium.support.ui.WebDriverWait;  
  7.   
  8. public class BaiduHome_page {  
  9.   
  10.     public WebDriver driver;  
  11.   
  12.     public BaiduHome_page(WebDriver driver){  
  13.         this.driver = driver;  
  14.         PageFactory.initElements(driver, this);  
  15.     }  
  16.   
  17.     //百度logo  
  18.     @FindBy(xpath="//div[@id='lg']/img")  
  19.     public WebElement ElementBaiduLogo;  
  20.   
  21.     //输入框  
  22.     @FindBy(id="kw")  
  23.     public WebElement ElementBaiduInput;  
  24.   
  25.     //按钮 查询一下  
  26.     @FindBy(id="su")  
  27.     public WebElement ElementSubmit;  
  28.   
  29.   
  30.     //获取当前页面面包屑信息 预约订单  
  31.     public String getPageTitle(){  
  32.         return driver.getTitle();  
  33.     }  
  34.   
  35.     // 输入查询内容,并点击查询按钮  
  36.     public void enterSearch(String searchText){  
  37.         WebDriverWait wait = new WebDriverWait(driver,30);  
  38.         wait.until(ExpectedConditions.elementToBeClickable(ElementBaiduInput));  
  39.         ElementBaiduInput.clear();  
  40.         ElementBaiduInput.sendKeys(searchText);  
  41.         ElementSubmit.click();  
  42.     }  
  43.   
  44.     // 输入查询内容,并点击查询按钮  
  45.     public void submit(){  
  46.         WebDriverWait wait = new WebDriverWait(driver,30);  
  47.         wait.until(ExpectedConditions.elementToBeClickable(ElementSubmit));  
  48.         ElementSubmit.click();  
  49.     }  
  50. }  

 

3、修改类BaiduSearchStepfs.java

 

修改类BaiduSearchStepfs.java,内容如下所示:

 

[java] view plain copy
 
  1. import com.BaiduHome_page;  
  2. import com.cucumber.config.ConfigManager;  
  3. import com.cucumber.utl.SharedDriver;  
  4. import cucumber.api.java.en.And;  
  5. import cucumber.api.java.en.Given;  
  6. import cucumber.api.java.en.Then;  
  7. import cucumber.api.java.en.When;  
  8. import org.junit.Assert;  
  9. import org.openqa.selenium.WebDriver;  
  10. import org.openqa.selenium.WebElement;  
  11.   
  12.   
  13. import java.util.concurrent.TimeUnit;  
  14.   
  15. public class BaiduSearchStepfs {  
  16.   
  17.     private final WebDriver driver;  
  18.     private final ConfigManager config;  
  19.     private final BaiduHome_page baiduHome_page;  
  20.     private static String baseUrl;  
  21.   
  22.     public BaiduSearchStepfs(SharedDriver driver, ConfigManager config, BaiduHome_page baiduHome_page) {  
  23.         this.driver = driver;  
  24.         this.config = config;  
  25.         this.baiduHome_page = baiduHome_page;  
  26.     }  
  27.   
  28.     @Given("^Go to baidu home$")  
  29.     public void go_to_baidu_home() throws Exception {  
  30.         baseUrl = this.config.get("base_path");  
  31.         this.driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);  
  32.         this.driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS);  
  33.         this.driver.navigate().to(baseUrl);  
  34.   
  35.     }  
  36.   
  37.     @When("^I find baidu logo")  
  38.     public WebElement i_find_baidu_logo() {  
  39.         WebElement element = this.baiduHome_page.ElementBaiduLogo;  
  40.         return element;  
  41.     }  
  42.   
  43.     @And("^Type the search text \"([^\"]*)\"$")  
  44.     public void type_the_search_text(String searchText) throws Throwable {  
  45.         this.baiduHome_page.enterSearch(searchText);  
  46.     }  
  47.   
  48.     @And("^Click the submit$")  
  49.     public void click_the_submit() {  
  50.         this.baiduHome_page.submit();  
  51.     }  
  52.   
  53.     @Then("^Wait the query result")  
  54.     public void wait_the_query_result() throws InterruptedException {  
  55.         Thread.sleep(10000);    //后面可以用显示等待或者隐示等待来优化代码  
  56.         Assert.assertEquals("selenium_百度搜索", this.baiduHome_page.getPageTitle());  
  57.     }  
  58. }  

 

4、运行程序

 

注意:上面我们是使用RemoteWebDriver,所以需要启动Selenium Standalone Server服务

到官网http://www.seleniumhq.org/download/,下载Selenium Standalone Server,并下载chromedriver.exe,放到指定的目录

通过命令行形式启动 Remote Webdriver服务器端
java  -Dwebdriver.chrome.driver=chromedriver.exe –jar selenium-server-standalone-2.53.0.jar
上述命令需要注意文件路径要写对,并可保存到start.bat文件中,以后每次双击即可启动Remote Webdriver服务器端

 

然后运行程序,运行结束后查看日志,一切正常,如下图所示

posted @ 2017-09-22 17:48  julieyuan  阅读(1261)  评论(0编辑  收藏  举报