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服务器端
然后运行程序,运行结束后查看日志,一切正常,如下图所示
- Cucumber java + Webdriver (4) 使用自动化测试的Page对象模式
- Cucumber java + Webdriver (7) 结合Page Object,使用LoadableComponent
- Cucumber java + Webdriver (5) Tags的使用
- Cucumber java + Webdriver (6) Cucumber的数据驱动
- Cucumber java + Webdriver (8) 使用命令行风格来编写测试场景(Scenario)
- JAVA自动化测试之页面对象模型(Page Object)
- java-selenium自动化测试page object、pageFactory 设计模式
- Cucumber java + Webdriver (1) 所需环境的安装
- 使用cucumber-jvm自动化测试中遇到问题及解决
- 关于 Cucumber 与 自动化测试的自我感触
- 自动化测试框架Cucumber和RobotFramework的实战对比
- 转载:自动化测试框架Cucumber和RobotFramework的实战对比
- 自动化测试框架Cucumber和RobotFramework的实战对比
- 自动化测试框架Cucumber和RobotFramework的实战对比
- 自动化测试框架Cucumber和RobotFramework的实战对比
- Webdriver Ui自动化测试,使用工厂方法生产不同浏览器的webdriver实例
- python3里使用selenium webdriver自动化测试
- 使用selenium和webdriver进行自动化测试
- Qt自定义事件的实现
- Django自带加密模块的使用
- 2、kxmovie在xcode7.0.1中运行所遇到的问题
- s3c6410 RomCode文档读后总结
- eclipse部署maven web项目到tomcat服务器时,没有将lib、web.xml复制过去的解决办法
- Cucumber java + Webdriver (4) 使用自动化测试的Page对象模式
- UE 上传视频失败
- 必知必会1
- android开发游记:性能测试中内存泄露排查方法与防止泄露编码心得
- 在Eclipse中使用Axis2插件生成Web Service服务端/客户端
- JQuery 级联操作实践
- 分辨率与精度的区别
- tableView手势 监听
- iOS 百度地图之坐标转换