美文网首页Selenium我爱编程
Selenium之使用PageFactory初始化pageobj

Selenium之使用PageFactory初始化pageobj

作者: 流浪骑士 | 来源:发表于2015-12-15 16:45 被阅读2970次

    使用PageFactory初始化pageobject有什么作用呢,下面举个例子来说明

    public BaiduPage baiduPage = PageFactory.initElements(driver,
                BaiduPage.class);
    

    场景:使用selenium 实现自动打开www.baidu.com首页,然后在搜索框内输入“路易”,并点击查找
    环境:win7,X86,IE浏览器,eclipse(安装testng插件)

    步骤一:
    在eclipse中创建一个maven项目,并在pom.xml中引入selenium和testng的依赖

    pom.xml
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.selelium.css</groupId>
        <artifactId>mycss</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <name>mycss</name>
    
        <dependencies>
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>2.48.2</version>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>6.9.9</version>
            </dependency>
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-ie-driver</artifactId>
                <version>2.48.2</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    步骤二:
    创建初始准备类:

    package mycss;
    
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.ie.InternetExplorerDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    
    public class InitPre {
    
        protected  WebDriver driver;
        private final String url = "www.baidu.com";
        
        public  InitPre(){
            String IEPath = "C:\\Program Files\\Internet Explorer\\iexplore.exe";
            //String IEPath_64 = "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe";
            String pro_Path = System.getProperty("user.dir");
            String IEDriver_Path = pro_Path + "\\IEDriverServer.exe";
            System.setProperty("webdriver.ie.bin", IEPath);
            System.setProperty("webdriver.ie.driver", IEDriver_Path);
    
            DesiredCapabilities ieCapabilities = DesiredCapabilities
                    .internetExplorer();
            ieCapabilities
                    .setCapability(
                            InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,
                            true);
            driver = new InternetExplorerDriver(ieCapabilities);
            driver.get(url);
    
        }
    }
    

    步骤3:
    将百度首页Pageobject:

    package mycss;
    
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.support.FindBy;
    
    public class BaiduPage {
    
        @FindBy(id = "kw")
        private WebElement indexInput;
    
        public void clearKeys_indexInput() {
            indexInput.clear();
        }
    
        public void sendkeys_indexInput(String index) {
            indexInput.sendKeys(index);
        }
    
        public void click_indexInput() {
            indexInput.click();
        }
    
    }
    

    步骤4:
    通过PageFactory初始化PageObject对象:

    package mycss;
    
    import org.openqa.selenium.support.PageFactory;
    
    public class InitPage extends InitPre {
        
    
        public BaiduPage baiduPage = PageFactory.initElements(driver,
                BaiduPage.class);
    
    }
    

    步骤5:
    编写测试用例:

    package mycss;
    
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.Test;
    
    public class IndexTest 
    {
    
        IndexTest(){
            System.out.println("IndexTest");
        }
    
        public InitPage initPage=new InitPage();
        BaiduPage baiduPage=initPage.baiduPage;
        
        @BeforeTest
        public void inittest(){
            
        }
                
        @Test
        public void index_test(){
            
            baiduPage.clearKeys_indexInput();
            baiduPage.sendkeys_indexInput("路易");
            baiduPage.click_indexInput();
        }
        
        
    }
    

    完成上面的步骤后,执行IndexTest类,然后可以看到打开浏览器,进入百度首页,然后搜索“路易”
    查看BaiduPage类可以知道,该类中仅对BaiduPage的控件和方法进行了封装,private WebElement indexInput indexInput并没有实例化,那么执行为什么会不报空指针呢?原因是因为下面的操作,PageFactory.initElements把driver传递给了BaiduPage的对象,当执行到WebElement indexInput indexInput这一步的话,传递的driver会在当前页面中查找该对象。大家可以尝试去掉代码中下面的一步,在执行用例查看运行结果

    public BaiduPage baiduPage = PageFactory.initElements(driver,
                BaiduPage.class);
    

    总结:
    Selenium2 引入了PageObject的思想,将每个页面的控件和操作封装成一个个Page类,然后在实现业务逻辑时,只需要调用对应的Page类即可。
    PageFactory则是为了支持PageObject而产生的,可以通过InitElements方法给Page类传递driver,当执行到WebElement时,driver在当前的页面中查找元素,这样不需要对WebElement进行实例化。如下面代码:

    @FindBy(id = "kw")
        private WebElement indexInput;
    

    相关文章

      网友评论

        本文标题:Selenium之使用PageFactory初始化pageobj

        本文链接:https://www.haomeiwen.com/subject/ntbuhttx.html