zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    axios
    JavaScript ES6部分语法
    JSP 基础之 JSTL <c:forEach>用法
    JS ajxa请求 返回数据
    java中的各种数据类型在内存中存储的方式
    sql之left join、right join、inner join的区别
    错误”ORA-12560: TNS: 协议适配器错误“解决方法
    Hibernate 和 Mybatis的区别
    eclipse启动几秒后报错 (一闪而过)
    sql ---- count 误区
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/4938751.html
Copyright © 2011-2022 走看看