selenium2-框架思想介绍

为什么要有框架?

可维护性

提高编写脚本效率

提高脚本的可读性

框架的几大要素:

1. driver管理

2. 脚本

3. 数据

4. 元素对象

5. Log

6. 报告

7. 运行机制

8. 失败用例重复运行

框架搭建的前期步骤

1.新建一个TestAutomation的Java项目
2.在这个项目下面新建一个config的文件夹,在config文件夹里面新建一个叫config.xml的文件
3.新建一个包:com.test.util
4.在项目下面再新建一个lib的文件夹,放入dom4j.jar与jaxen.jar,用来解析config.xml文件
5.再新建一个ParseXml.java的文件。

    image

为什么要有config.xml文件

1.全局配置文件
2.可以在这里面配置运行哪个浏览器
3.可以定义等待元素display的时间
4.文件格式为.xml文件(当然可以用其它的文件格式,依个人喜好而定)

image

解析config.xml文件

1.使用dom4j.jar, jaxen-1.1.1.jar
2.代码演示解析过程及方法
1>文件载入

  image

2>XML解析

  image

3>XML节点判断

  image

4>XML完整处理

  image

5>XML读取案例

  image

配置文件的值持久化
1.新建一个类:com.test.util.Config.java

image

Driver管理
1.新建一个com.test.base.SeleniumDriver类
2.代码演示
3.具体代码:

image

最后我们来启动一下浏览器

image

具体代码如下

config.xml:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <config>
3     <browser>firefox</browser>
4     <waitTime>30</waitTime>
5 </config>

ParseXml.java:

package com.test.util;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/*
 * 读取xml配置文件
 *     1. 加载
 *     2. 解析
 */
public class ParseXml {

    private static Document document;
    private String filePath;

    // 为了简化代码,否则每次都要px.load
    public ParseXml(String filePath) {
        this.filePath = filePath;
        this.load(filePath);
    }

    public void load(String filePath) {
        // xml解析,首先载入xml文件,对这个文件对象进行xml分析处理
        File file = new File(filePath);
        if (file.exists()) {
            SAXReader saxReader = new SAXReader();
            try {
                document = saxReader.read(file);
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                // e.printStackTrace();
                System.out.println("文件加载异常" + filePath);
            }
        } else {
            System.out.println("文件加载异常" + filePath);
        }
        // document.selectSingleNode(arg0)
    }

    // 读取xml结点
    public Element getElementObject(String elementPath) {
        return (Element) document.selectSingleNode(elementPath);
    }

    public String getElementText(String elementPath) {
        Element element = this.getElementObject(elementPath);
        if (element != null) {
            return element.getTextTrim();
        } else {
            return null;
        }
    }

    /*
     * 判断结点是否为空
     */
    public boolean isExist(String elementPath) {
        boolean flag = false;
        Element element = this.getElementObject(elementPath);
        if (element != null) {
            flag = true;
        }
        return flag;
    }

    /*
     * 遍历结点
     */
    // 加@是为了无视方法里边出现的警告
    @SuppressWarnings("unchecked")
    public List<Element> getElementObjects(String elementPath) {
        return document.selectNodes(elementPath);
    }

    // 遍历到map中
    @SuppressWarnings("unchecked")
    public Map<String, String> getChildrenInfoByElement(Element element) {
        Map<String, String> map = new HashMap<String, String>();
        List<Element> children = element.elements();
        for (Element e : children) {
            map.put(e.getName(), e.getText());
        }
        return map;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // ParseXml px = new ParseXml();
        // px.load("config/config.xml");
        ParseXml px = new ParseXml("config/config.xml");
        String browser = px.getElementText("/*/browser");
        System.out.println(browser);
        String waitTime = px.getElementText("/*/waitTime");
        System.out.println(waitTime);

        // ParseXml px = new ParseXml("config/config.xml");
        // List<Element> elements = px.getElementObjects("/*/testUI");
        // Object[][] object = new Object[elements.size()][];
        // for (int i = 0; i < elements.size(); i++) {
        // Object[] temp = new Object[] { px.getChildrenInfoByElement(elements
        // .get(i)) };
        // object[i] = temp;
        // }
        // Object o = object[1][0];
        // System.out.println(((Map<String, String>) o).get("description"));

    }
}

config.java:

package com.test.util;

public class config {

    public static String Browser;
    public static int waitTime;

    // static是个静态写法,无论怎么执行,static只会执行一次
    static {
        ParseXml px = new ParseXml("config/config.xml");
        Browser = px.getElementText("/*/browser");
        // 强制转换为整型
        waitTime = Integer.valueOf(px.getElementText("/*/waitTime"));

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 把init改写成static之后就不用每次手动调用init方法了,会自动调用staic,其只会执行一遍。
        // config my = new config();
        // my.init();
        System.out.println(Browser);
        System.out.println(waitTime);
    }
}

SeleniumDriver.java:

package com.test.util;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SeleniumDriver {
    public WebDriver driver;

    public WebDriver getDriver() {
        return driver;
    }

    // 初始化
    public SeleniumDriver() {
        this.initDriver();
    }

    private void initDriver() {
        if ("firefox".equals(config.Browser)) {
            driver = new FirefoxDriver();
        } else if ("ie".equals(config.Browser)) {

        } else if ("chrome".equals(config.Browser)) {

        } else {
            System.out.println("浏览器匹配值错误" + config.Browser);
        }
        driver.manage().window().maximize();
        driver.manage().timeouts()
                .pageLoadTimeout(config.waitTime, TimeUnit.SECONDS);
        // return driver;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 定义对象的时候同时初始化,因为有构造函数
        SeleniumDriver selenium = new SeleniumDriver();
        WebDriver driver = selenium.getDriver();
        driver.navigate().to("http://www.baidu.com");
        driver.close();
    }

}

最后打个广告,不要介意哦~

最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!

链接:http://www.dataguru.cn/invite.php?invitecode=G863

原文地址:https://www.cnblogs.com/yajing-zh/p/4938751.html