selenium测试框架(java) 版本演化一

selenium的自动化测试代码应该如何组织?  如链接:https://code.google.com/p/selenium/wiki/PageObjects  这里提供了一种PageObject的设计思想,并且在百度内部给出了一个感觉比较实用的实现。其组织结构思想如下:

Page    封装页面元素,以及页面应提供的服务。
        尽量隐藏页面的细节,不要暴露出来。

widget  封装Page中的通用的组件。
        这里的理念是所有的WebElement都是控件。
        通用的页面样式,如导航栏,列表,组合查询框,可以封装成一个大控件。

Data    封装测试数据。

Test    封装测试驱动代码。推荐使用testng。

本文意图重新搭建一个简化的测试框架。

第一个版本,建立起可测的Selenium项目。  包含一个page基类,一个继承的实际待测页面BaiduMainPage,一个驱动的测试用例BaiduMainPageTest。

下面的需要改进点:  1,BaiduMainPageTest中使用的driver是在test中明确的声明为FireFox。应该用配置的方式来实现选用任意一个Driver。并且这里需要实现一个基类来完成这些事情。

2,可以将初始化元素,并将打开页面的过程封装成一个导航类。另外,经常会发生NoSuchElementException。添加等待后,基本解决。但是需要排查出现的原因,怀疑是没有及时加载。

框架代码

项目使用maven管理:

<dependencies>
    <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.41.0</version>
    </dependency>
    <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.5</version>
    </dependency>
    <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <version>1.7.5</version>
    </dependency>
    <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.8</version>
    </dependency>

BasePage

/**
 * <p>The <b>Page Object</b> pattern represents the screens of your web app as a series of
 * objects.</p>
 *
 * <p>PageObjects can be thought of as facing in two directions simultaneously.
 * Facing towards the developer of a test, they represent the services offered
 * by a particular page. Facing away from the developer, they should be the only
 * thing that has a deep knowledge of the structure of the HTML of a page (or
 * part of a page) It‘s simplest to think of the methods on a Page Object as
 * offering the "services" that a page offers rather than exposing the details
 * and mechanics of the page.</p>
 *
 * @see <a href="http://code.google.com/p/webdriver/wiki/PageObjects">Page Objects Wiki</a>
 *
 * @author lizejun
 */
public abstract class Page implements SearchContext{

    protected Logger logger = LoggerFactory.getLogger(getClass());

    protected WebDriver driver = null;

    public Page(WebDriver driver) {
        if (null == driver) {
            throw new IllegalArgumentException("WebDriver cannot be null.");
        }
        this.driver = driver;
    }

    public WebDriver getWebDriver() {
        return driver;
    }

    /**
     * 获得当前的地址
     * @return
     */
    public String getCurrentUrl() {
        return driver.getCurrentUrl();
    }

    /**
     *  获取某个元素
     */
    public WebElement findElement(By by) {
        return driver.findElement(by);
    }

    /**
     * 获取符合
     */
    public List<WebElement> findElements(By by) {
        return driver.findElements(by);
    }

    /**
     * 用于硬性的等待
     * @param seconds
     */
    public void sleep(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 用于等待某个元素出现,软等待
     * @param by
     */
    public boolean wait(final By by){
        new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver arg0) {
                return arg0.findElement(by).isDisplayed();
            }
        });
        return true;
    }

    /**
     * 处理页面上弹出的Alert()
     * @param option
     */
    public Alert getAlert(){
        sleep(2);
        Alert alert = driver.switchTo().alert();
        return alert;
    }

    /**
     * 模拟键盘箭头向下,然后回车。即,模拟下拉选中
     */
    public void KeyDownAndEnter(){
        sleep(1);
        Actions actions = new Actions(driver);
        actions.sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
    }

    /**
     * 模拟键盘回车
     */
    public void KeyEnter(){
        sleep(1);
        Actions actions = new Actions(driver);
        actions.sendKeys(Keys.ENTER).build().perform();
    }

    /**
     * 关闭当前页面,并将焦点放到打开的新页面
     */
    public void switchToNewPage(){
        sleep(1);
        String handleNew="";
        for (String handle : driver.getWindowHandles()) {
            handleNew=handle;
        }
        driver.close();
        sleep(1);
        driver.switchTo().window(handleNew);
    }

}

DemoPage

public class BaiduMainPage extends Page{

    public BaiduMainPage(WebDriver driver) {
        super(driver);
    }

    /**
     * 输入文本input
     */
    @FindBy(how=How.ID,using="kw1")
    WebElement inputbox;

    /**
     * 查询按钮
     */
    @FindBy(how=How.ID, using="su1")
    WebElement submitbox;

    /**
     * 新闻链接
     */
    @FindBy(name="tj_news")
    WebElement newsIndex;

    /**
     * 输入待搜素文本
     * @param text
     */
    public void SearchText(String text) {
        inputbox.sendKeys(text);
        submitbox.click();
    }

    public void clickNewsIndex() {
        newsIndex.click();
    }
}

TestCase with testng

public class BaiduMainPageTest{

    protected WebDriver driver = null;

    protected BaiduMainPage page = null;

    @BeforeClass
    public void init() {
        driver = new FirefoxDriver();
    }

    @BeforeMethod
    public void initPage() {
        String path = "http://www.baidu.com/";
        driver.get(path);
        page = new BaiduMainPage(driver);
        PageFactory.initElements(driver, page);
    }

    @Test
    public void testSearch(){
        String text="apple";
        page.SearchText(text);
        Assert.assertTrue(driver.getTitle().contains(text));
        System.out.println(page.getCurrentUrl());
    }

    @Test
    public void testnews(){
        page.clickNewsIndex();
        page.sleep(2);
        System.out.println(page.getCurrentUrl());
        Assert.assertTrue(page.getCurrentUrl().contains("news.baidu.com"));
    }

    @AfterClass
    public void quit() {
        driver.quit();
    }
}
时间: 2024-10-24 13:23:09

selenium测试框架(java) 版本演化一的相关文章

selenium测试框架使用xml作为对象库

之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locator对象 不能够实现Locator对象重名 文件比较大,读写速度没有xml快 所以,重新写了使用dom4j操作xml,使用xml管理Locator对象,能够有效解决以上问题 首先,定义Locator文件 <?xml version="1.0" encoding="UTF-8&

selenium 测试框架中使用grid

之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecrazy/p/4529399.html 在测试框架中使用Log4J 2 :http://www.cnblogs.com/tobecrazy/p/4557592.html 首先介绍一下grid ,selenium grid 是一种执行测试用例时使用的包含不同平台(windows.Linux.Androi

selenium测试框架篇,页面对象和元素对象的管理

前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对

selenium测试框架篇

做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对象),一个输入密码的密码框 一个登陆框.当然,zhihu不止一个页面,有无数页面,每一个页面都可以封装为一个对象.而每个 页面的元素,也可

java + selenium测试框架(之等待机制) 版本演化二

使用selenium-ide录制,以及直接用selenium-java.jar写测试用例,你会发现它的执行速度很快.大大超过了手工操作的速度,甚至可能也超过了浏览器加载的速度(比浏览器都快?结果就是找不到元素). 如果页面上确实有某个元素,但是在测试时提示NoSuchElementException,那原因有两个:1,你抓取元素的策略错了:2,执行时元素还没加载出来. 在调用了driver.get(url)之后,为了保证元素能够取到正确初始化,需要增加一个等待加载完成的函数,保证页面完成加载.

selenium测试(Java)-- 一组元素操作(十一)

利用下面的例子来编写测试脚本 页面代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 5 <title>CheckBox</title> 6 <link 7 href="http://cdn.bootcss.co

selenium测试(Java)--下载文件(十六)

下载文件需要在Firefox 的profile属性中配置一些参数,如下面的代码: package com.test.download; import java.io.File; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDri

selenium测试(Java)--元素操作(五)

元素的操作有 1. 清除文本 2. 模拟按键输入 3. 单击元素 4. 返回元素尺寸 5. 获取文本 6. 获取属性值 7. 判断是否可见 8. 提交 下面通过操作新浪邮箱的注册界面的脚本来展示使用方法 源代码: package com.test.elementoperation; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement;

selenium测试(Java)--鼠标事件

鼠标操作: 1.右击 2.双击 3.拖到 4.悬停 1 package com.test.mouse; 2 3 import java.io.File; 4 5 import org.openqa.selenium.By; 6 import org.openqa.selenium.WebDriver; 7 import org.openqa.selenium.WebElement; 8 import org.openqa.selenium.firefox.FirefoxDriver; 9 imp