Cucumber java + Webdriver (4) 使用自动化测试的Page对象模式

来源:互联网 发布:sql注入防御 编辑:程序博客网 时间:2024/06/05 20:19

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

1、创建一个类来启动driver

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

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


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

import com.cucumber.config.ConfigManager;import cucumber.api.Scenario;import cucumber.api.java.After;import cucumber.api.java.Before;import org.openqa.selenium.OutputType;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebDriverException;import org.openqa.selenium.remote.DesiredCapabilities;import org.openqa.selenium.remote.RemoteWebDriver;import org.openqa.selenium.support.events.EventFiringWebDriver;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.TimeUnit;public class SharedDriver extends EventFiringWebDriver {    private static WebDriver REAL_DRIVER = null;    private static final Thread CLOSE_THREAD = new Thread() {        @Override        public void run() {            REAL_DRIVER.close();        }    };    static {        Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);        ConfigManager config = new ConfigManager();        DesiredCapabilities browser = null;        if ("firefox".equalsIgnoreCase(config.get("browser"))) {            browser = DesiredCapabilities.firefox();        } else {            browser = DesiredCapabilities.chrome();        }        browser.setJavascriptEnabled(true);        try {            REAL_DRIVER = new RemoteWebDriver(new URL(config.get("selenium_server_url")), browser);        } catch (MalformedURLException exceptions) {        }    }    public SharedDriver () {        super(REAL_DRIVER);        REAL_DRIVER.manage().window().maximize();        REAL_DRIVER.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);    }    @Override    public void close() {        if (Thread.currentThread() != CLOSE_THREAD) {            throw new UnsupportedOperationException("You shouldn't close this WebDriver. It's shared and will close when the JVM exits.");        }        super.close();    }    @Before    public void deleteAllCookies() {        REAL_DRIVER.manage().deleteAllCookies();    }    @After    public void embedScreenshot(Scenario scenario) {        try {            byte[] screenshot = getScreenshotAs(OutputType.BYTES);            scenario.embed(screenshot, "image/png");        } catch (WebDriverException somePlatformsDontSupportScreenshots) {            System.err.println(somePlatformsDontSupportScreenshots.getMessage());        }    }}

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


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

public class ConfigManager {    private static Properties defaultProperties = null;    static {        defaultProperties = new Properties();        try {            defaultProperties.load(new FileReader("config/default.properties"));            File customConfigFile = new File("config/custom.properties");            if (customConfigFile.exists()) {                defaultProperties.load(new FileReader(customConfigFile));            }        } catch (IOException exception) {            System.err.println("未找到配置文件");        }        if (!defaultProperties.isEmpty()) {            for (Object key : defaultProperties.keySet()) {                if (System.getProperty((String)key) != null) {                    defaultProperties.setProperty((String)key, System.getProperty((String)key));                }            }        }    }    public ConfigManager() {    }    public String get(String key) {        return defaultProperties.getProperty(key);    }}
之后在项目下,新建目录config,并创建两个文件custom.properties(自己用的配置文件,可以随意修改) 和 default.properties(可以留作后面团队整体运行测试时用)

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

selenium_server_url = http://127.0.0.1:4444/wd/hubbrowser = chromebase_path = http://www.baidu.com

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

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


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

import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;public class BaiduHome_page {    public WebDriver driver;    public BaiduHome_page(WebDriver driver){        this.driver = driver;        PageFactory.initElements(driver, this);    }    //百度logo    @FindBy(xpath="//div[@id='lg']/img")    public WebElement ElementBaiduLogo;    //输入框    @FindBy(id="kw")    public WebElement ElementBaiduInput;    //按钮 查询一下    @FindBy(id="su")    public WebElement ElementSubmit;    //获取当前页面面包屑信息 预约订单    public String getPageTitle(){        return driver.getTitle();    }    // 输入查询内容,并点击查询按钮    public void enterSearch(String searchText){        WebDriverWait wait = new WebDriverWait(driver,30);        wait.until(ExpectedConditions.elementToBeClickable(ElementBaiduInput));        ElementBaiduInput.clear();        ElementBaiduInput.sendKeys(searchText);        ElementSubmit.click();    }    // 输入查询内容,并点击查询按钮    public void submit(){        WebDriverWait wait = new WebDriverWait(driver,30);        wait.until(ExpectedConditions.elementToBeClickable(ElementSubmit));        ElementSubmit.click();    }}

3、修改类BaiduSearchStepfs.java

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

import com.BaiduHome_page;import com.cucumber.config.ConfigManager;import com.cucumber.utl.SharedDriver;import cucumber.api.java.en.And;import cucumber.api.java.en.Given;import cucumber.api.java.en.Then;import cucumber.api.java.en.When;import org.junit.Assert;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import java.util.concurrent.TimeUnit;public class BaiduSearchStepfs {    private final WebDriver driver;    private final ConfigManager config;    private final BaiduHome_page baiduHome_page;    private static String baseUrl;    public BaiduSearchStepfs(SharedDriver driver, ConfigManager config, BaiduHome_page baiduHome_page) {        this.driver = driver;        this.config = config;        this.baiduHome_page = baiduHome_page;    }    @Given("^Go to baidu home$")    public void go_to_baidu_home() throws Exception {        baseUrl = this.config.get("base_path");        this.driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);        this.driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS);        this.driver.navigate().to(baseUrl);    }    @When("^I find baidu logo")    public WebElement i_find_baidu_logo() {        WebElement element = this.baiduHome_page.ElementBaiduLogo;        return element;    }    @And("^Type the search text \"([^\"]*)\"$")    public void type_the_search_text(String searchText) throws Throwable {        this.baiduHome_page.enterSearch(searchText);    }    @And("^Click the submit$")    public void click_the_submit() {        this.baiduHome_page.submit();    }    @Then("^Wait the query result")    public void wait_the_query_result() throws InterruptedException {        Thread.sleep(10000);    //后面可以用显示等待或者隐示等待来优化代码        Assert.assertEquals("selenium_百度搜索", this.baiduHome_page.getPageTitle());    }}

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服务器端


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





2 0
原创粉丝点击