浅析selenium的PageFactory模式

前面的文章介绍了selenium的PO模式,见文章:http://www.cnblogs.com/qiaoyeye/p/5220827.html。下面介绍一下PageFactory模式。

1.首先介绍FindBy类:

For example, these two annotations point to the same element:

 @FindBy(id = "foobar") WebElement foobar;
 @FindBy(how = How.ID, using = "foobar") WebElement foobar; 

and these two annotations point to the same list of elements:


 @FindBy(tagName = "a") List<WebElement> links;
 @FindBy(how = How.TAG_NAME, using = "a") List<WebElement> links;

用来分别查找单个元素和多个元素的两种用法,支持的类型有:classNamecssidlinkTextnamepartialLinkTexttagNamexpath

How支持的类型和上面差不多。

2.接着介绍PageFactory类

Factory class to make using Page Objects simpler and easier.

它提供的方法都是静态的,可以直接调用,我们在用完findby后,需要进行元素初始化,则需要调用下面的方法

initElements(ElementLocatorFactory factory, java.lang.Object page)、initElements(FieldDecorator decorator, java.lang.Object page)、initElements(WebDriver driver, java.lang.Class<T> pageClassToProxy)、initElements(WebDriver driver, java.lang.Object page)

我们在实际使用中可以这样用:

PageFactory.initElements(dr, XXX.class);

或者

PageFactory.initElements(new AjaxElementLocatorFactory(dr, 10) ,XXX.class);

后者加入了初始化元素时等待时间。

3.在代码中如何设计

a.新建一个BasePage类

class BasePage {
    WebDriver dr;
    private final int TIMEOUT = 10;

    BasePage() {}

    BasePage(WebDriver dr) {
        this.dr = dr;
        PageFactory.initElements(new AjaxElementLocatorFactory(dr, TIMEOUT) , this);
    }

    BasePage(WebDriver dr, final String title) {
        this.dr = dr;

        //如果不进行判断,
        WebDriverWait wait = new WebDriverWait(dr,TIMEOUT);
        try{
            boolean flag = wait.until(new ExpectedCondition<Boolean>(){
                @Override
                public Boolean apply(WebDriver arg0) {
                    // TODO Auto-generated method stub
                    String acttitle = arg0.getTitle();
                    return acttitle.equals(title);
                }});
        }catch(TimeoutException te) {
            throw new IllegalStateException("当前不是预期页面,当前页面title是:" + dr.getTitle());
        }

        PageFactory.initElements(new AjaxElementLocatorFactory(dr, TIMEOUT) , this);

    }
    void fun2() {}
    void fun3() {}
}

b.建两个页面类LoginPage和HomePage,分别继承BasePage

class LoginPage extends BasePage{
    @FindBy(id="UserName")
    @CacheLookup //加入缓存,更新值的时候先从缓存中取
    private WebElement input_username;

    @FindBy(css="html body div.loginbox div#NoCodeLogin.formbox.errorBox div#ElongLogin div#password_tip.inputbox.login_pw input.blur")
    @CacheLookup
    private WebElement temp_input_password;

    @FindBy(id="PassWord")
    @CacheLookup
    private WebElement input_password;
    //WebDriver dr;

    /*
    @FindBy(name="captcha")
    @CacheLookup
    WebElement input_imgcode;

    @FindBy(css="html.show-app-promotion-bar.cssanimations.csstransforms.csstransitions.flexbox.no-touchevents.no-mobile body.zhi.no-auth div.index-main div.index-main-body div.desk-front.sign-flow.clearfix.sign-flow-simple div.view.view-signin form div.group-inputs div.input-wrapper.captcha-module div.captcha-container img.js-refresh-captcha.captcha")
    @CacheLookup
    WebElement imgcode;*/

    @FindBy(className="loginbtn")
    @CacheLookup
    private WebElement button_submit;

    LoginPage(WebDriver dr) {
        super(dr);
    }
    LoginPage(WebDriver dr, String titile) {
        super(dr, titile);
    }
    HomePage login() {

        typeusername("0000");
        typepassword("111111");
        button_submit.click();

        return new HomePage(dr,"艺龙机票】机票查询,特价机票,打折飞机票-艺龙旅行网eLong.com");
    }

    void typeusername(String name) {
        input_username.clear();
        input_username.sendKeys(name);
    }
    void typepassword(String password) {
        temp_input_password.click();
        input_password.clear();
        input_password.sendKeys(password);
    }
    void formsubmit() {

    }
}

class HomePage extends BasePage {

    HomePage(WebDriver dr) {
        super(dr);
        // TODO Auto-generated constructor stub
    }

    public HomePage(WebDriver dr, String title) {
        // TODO Auto-generated constructor stub
        super(dr, title);
    }

    @FindBy(id="btnSearch")
    private WebElement btn_search;

}

c.建一个测试类,做为入口

package com.test;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

/**
 * @author  qiaojiafei
 * @version 创建时间:2016年4月22日 下午1:26:59
 * 类说明
 */
public class TestFactory {
    public static void main(String args[]) {
        WebDriver dr = new SafariDriver();
        dr.get("https://secure.elong.com/passport/login_cn.html");
        String logintitle = "会员登录–elong.com艺龙旅行网";
        LoginPage lp = new LoginPage(dr, logintitle);
        HomePage hp = lp.login();
    }
}

到底为止结束,在每个页面的构造方法,加入页面title的验证,是为了保证跳转的页面与预期的页面一致后,再进行页面元素的初始化,否则,页面都没跳转正确,就进行元素初始化时多余的。

时间: 2025-01-02 09:20:45

浅析selenium的PageFactory模式的相关文章

selenium(六)Page Object模式(使用selenium的PageFactory)

PageObject 类 import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class PageObject { private String url="http://www.baidu.com&qu

在Python中实现PageFactory模式

关于 PageFactory 的概念主要是Java中内置了PageFactory类. import org.openqa.selenium.support.PageFactory; …… 例子,http://libin0019.iteye.com/blog/1260090 Python(Selenium)中没有这个类. PageFactory 的概念和Page Object应该类似,属于一种设计模式.所以并不局限于语言及场景.于是,好奇,既然Java有,那Python也应该有类似的玩法.还真让我

转在Python中实现PageFactory模式

转自: http://www.cnblogs.com/fnng/p/5092383.html 关于 PageFactory 的概念主要是Java中内置了PageFactory类. import org.openqa.selenium.support.PageFactory; …… 例子,http://libin0019.iteye.com/blog/1260090 Python(Selenium)中没有这个类. PageFactory 的概念和Page Object应该类似,属于一种设计模式.所

Selenium的PageFactory &amp; PageObject 知多少

出路出路,走出去了,总是会有路的:困难苦难,困在家里就是难. 因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了. 在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设

浅析微信营销传播模式

导语:现在的很多企业都建立了微信公众平台,为的是更好的利用微信来达到盈利的目的,在建立公众微信平台之前,我们应该全面了解微信的传播特性和模式  ,这样才更有利于以后的操作. 1.传播特性 传播渠道是传播过程的重要中介,传播者利用传播渠道可将选择加工的信息,传递给受传者并引起相应的反应.传播渠道是信息源源不断地传递的重要一环 .微 信的产生不断地更新着传播的形式,丰富着传播的内容,提高了传播信息的速度,同时对这些优势的反馈又促进着微信的进一步发展. (1)病毒式的用户推广 通过手机通讯录添加好友或

浅析selenium的page object模式

selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好的提现java的面向对象和封装特性,首先看一下官网的解释: Page Object Design Pattern Page Object is a Design Pattern which has become popular in test automation for enhancing tes

Selenium的PageFactory &amp; PageObject 在大型项目中的应用

因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了. 在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设计适应项目的一套自动化测试代码结构,基本的思路就是对每一个页面

Selenium的PageFactory知多少

出路出路,走出去了,总是会有路的:困难苦难,困在家里就是难. 因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了. 在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常 操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以

Selenium自动化Page模式(Python)

Selenium是当前主流的web自动化工具,提供了多种浏览器的支持(Chrome,Firefox, IE等等),当然大家也可以用自己喜欢的语言(Java,C#,Python等)来写用例,很容易上手.当大家写完第一个自动化用例的时候肯定感觉”哇...好牛x“,但是大家用余光扫了一下代码后,内心也许是崩溃的,因为太乱了!像这样: __author__ = 'xua' from selenium import webdriver from selenium.webdriver.common.keys