精华内容
下载资源
问答
  • (1)基础类:封装基础类(BasePage),基础类可以包含WebDriver实例的属性,如驱动的定义、对元素定位的二次封装等 (2)页面层:每一个页面类(Page)都要继承基础类,并通过驱动(driver)来管理本页的元素,并将...

    第一种

    页面类(Page)

    from selenium import webdriver
    def open_browser(name, url):
        if name == 'chrome':
            driver = webdriver.Chrome()
        if name == 'ff':
            driver = webdriver.firefox()
        if name == 'ie':
            driver = webdriver.ie
        driver.maximize_window()
        driver.get(url)
        return  driver
    class TestKeys(object):
        def __init__(self,name,url):  #打开浏览器
            self.driver=open_browser(name,url)
        def input_text(self,locator_type,locator,text):  #输入值SendKeys方法驱动
            if locator_type=='xpath':
                self.driver.find_element_by_xpath(locator).send_keys(text)
            if locator_type=='id':
                self.driver.find_element_by_id(locator).send_keys(text)
            if locator_type=='name':
                self.driver.find_element_by_name(locator).send_keys(text)
        def click_elements(self,locator_type,locator):   #点击click方法驱动
            if locator_type=='xpath':
                self.driver.find_element_by_xpath(locator).click()
            if locator_type=='id':
                self.driver.find_element_by_id(locator).click()
            if locator_type=='name':
                self.driver.find_element_by_name(locator).click()
        def quit(self):
            self.driver.quit()
    

    测试用例(TestCase)

    from selenium import webdriver
    from PO.test_key import *
    from time import sleep
    #封装后
    #通过浏览器驱动,调用Chrome浏览器
    driver=TestKeys('chrome','http://www.baidu.com')
    sleep(2)
    driver.input_text('id','kw','CSDN')
    driver.click_elements('id','su')
    

    第二种

    from selenium import webdriver
    from time import sleep
    class TestKeys(object):
        #初始化关键字驱动类
        def __init__(self,name):  #打开浏览器
            self.driver=self.open_browser(name)
        #打开浏览器,打开指定网址
        def open_browser(self, name):
            if name == 'chrome':
                driver = webdriver.Chrome()
            elif name == 'ff':
                driver = webdriver.firefox()
            elif name == 'ie':
                driver = webdriver.ie
            else:
                self.driver = 'browser name error'
            return driver
        #访问指定URL
        def visit(self,url):
            self.driver.get(url)
        #元素定位
        def element_locator(self,locator_type,locator):  #输入值SendKeys方法驱动
            if locator_type=='xpath':
                el=self.driver.find_element_by_xpath(locator)
            elif locator_type=='id':
                el=self.driver.find_element_by_id(locator)
            elif locator_type=='name':
                el=self.driver.find_element_by_name(locator)
            else:
                el="locator error"
            return el
        #输入文本
        def input_text(self,locator_type,locator,text):
            self.element_locator(locator_type,locator).send_keys(text)
        #点击操作
        def click_ele(self,locator_type,locator):
            self.element_locator(locator_type,locator).click()
        #关闭浏览器
        def quit(self):
            self.driver.quit()
        #强制等待
        def wait(self,time):
            sleep(time)
    

    关键字驱动+unittest

    import unittest
    from selenium import webdriver
    from time import sleep
    from ddt import ddt,data,unpack
    from 关键字.test_key import *
    
    @ddt
    #unittest+关键字驱动,setUp,tearDown,testcase
    class MyTestCase(unittest.TestCase):
        #前置条件
        def setUp(self):
            self.driver=TestKeys('chrome')
            self.driver.visit('http://www.baidu.com')
        #后置条件
        def tearDown(self):
            sleep(2)
            self.driver.quit()
        #测试用例
        @data(('id','kw','su','张三'),('id','kw','su','李四'))
        @unpack  #解封成三个参数
        def test_1(self,locator_type,locator,locator1,text):
            self.driver.input_text(locator_type,locator,text)
            self.driver.click_ele(locator_type,locator1)
    if __name__ == '__main__':
        unittest.main()
    
    展开全文
  • 自动化测试现在越来越趋向于平台化,平台化是致力于协同工作,提高效率,让更多人参与自动化的一个过程,在我看来,平台化中,有一个更为关键点,就是关键字驱动,只有把自动化测试的代码转换成为大家更容易懂的自然...

    自动化测试现在越来越趋向于平台化,平台化是致力于协同工作,提高效率,让更多人参与自动化的一个过程,在我看来,平台化中,有一个更为关键点,就是关键字驱动,只有把自动化测试的代码转换成为大家更容易懂的自然语言,才能让更多不懂代码的人加入进去,才能达到平台化的目的。今天我们就来谈谈自动化测试中关键字驱动的原理及实现方式。

    先来看一个例子,老师对着同学们说了一句:去把桌子从A地点搬到B地点。当老师发出这个命令后,发现没有人动,因为没有明确的对象,不知道这个命令是对谁发出的,于是老师再说了一句:张三,去把桌子从A地点搬到B地点。这时候,有了明确的对象--张三,有了命令的主体--搬桌子从A到B。所以这句” 张三,去把桌子从A地点搬到B地点”中就有两个关键字:张三、把桌子从A地点搬到B地点。当这两个关键字缺少任何一个,这件事就不可能完成。所以,我们可以把这个场景理解为关键字驱动,假如我们把上面这句话转换为代码:

    public class MoveDesk {

    private Person zhangsan;

    public void setZhangsan(Person zhangsan) {

    this.zhangsan = zhangsan;

    }

    public void moveDeskFromA2B(){

    zhangsan.getTheCommandFromTeacher();

    zhangsan.findTheDeskAtA();

    zhangsan.moveDeskToB();

    zhangsan.notifyTeacherHadFinished();

    }

    public static void main(String[] args) {

    MoveDesk md = new MoveDesk();

    md.setZhangsan("张三");

    md.moveDeskFromA2B();

    }

    }

    上面的代码当然是伪代码,但从中可以看出,其为了达到一个目的,流程都是一样的,那两个关键字在main方法中体现为:张三对应md.setZhangsan("张三"),”把桌子从A地点搬到B地点”对应md.moveDeskFromA2B()。由此我们可以这样理解一下:每一个关键字对应一个具体的方法。所以,总结一下关键字驱动的实现特点:

    1. 每一个关键字对应的方法(以下称为关键方法)必须能够随时被调用,这就像老师对张三发出的命令张三必须去执行一样。在JAVA里面为了达到这个关键方法随时能被调用,其类对象必须事先就被new好,所以要有一个对象池,这个对象池就像一个班级,有很多个学生可以供老师发出命令并去执行。

    2. 关键字必须与关键方法进行关联,就像老师让张三搬桌子,而张三跑去买了一包烟,这就不对了,所以,必须要有一个关键字与关键方法的映射表。

    3. 得有一个关键字的解析方式,比如上面那条命令中,我们要能够得出张三、把桌子从A地点搬到B地点这两个关键字,要是不能得出关键字,关键方法就会少执行,就如上面的伪代码中,如果去掉md.setZhangsan("张三")这一句,显然就会报空指针异常了。

    4. 上面这三条具备后,就是执行了,老师发出的命令,张三要能够执行,当然,要是张三是个刺头就另说了。JAVA代码能够交给JVM去执行,但转换成为关键字后,JVM就不认识这些关键字了,所以,我们也必须要有一个健壮的执行引擎,让“张三,去把桌子从A地点搬到B地点”这一句话能够被执行成功。

    综上所述,只要我们把上面的四条通过代码来实现,一个简单的关键字框架雏形就出来了,接下来我们一条条的实现。

    1.对象池:

    public class RegisterCenter {

    public static Map OBJ_POOLS = new HashMap();

    static{

    OBJ_POOLS.put(MoveDesk.class.getName(), new MoveDesk());

    }

    }

    将所有含有关键方法的类都初始化一遍,然后放到OBJ_POOLS这个对象里,方面后面直接调用关键方法。(请大家试着用注解去实现,会更炫)

    2.映射表:

    public class KeywordReflect {

    public static Map> KEYWORD_POOLS = new HashMap>();

    static{

    KEYWORD_POOLS.put("张三", KeywordReflect.methodInfo(MoveDesk.class.getName(), "setZhangsan"));

    KEYWORD_POOLS.put("把桌子从A地点搬到B地点", KeywordReflect.methodInfo(MoveDesk.class.getName(), "moveDeskFromA2B"));

    }

    public static Map methodInfo(String className, String methodName){

    Map methodInfo = new HashMap();

    methodInfo.put("class", className);

    methodInfo.put("method", methodName);

    return methodInfo;

    }

    }

    说明:上面的KEYWORD_POOLS对象的数据结构是MAP里面套了一个MAP,这是因为要明确类对象,因为不同的类里可能有相同名称的方法,所以,为了避免混乱,必须标注好一个方法的类与方法名,这样才能建立好一一对应的映射表。(同样可以用注解来实现)

    3.解析关键字

    为了能够解析出关键字,我们得把” 张三,去把桌子从A地点搬到B地点”这句话的关键字给标注出来,改造一下”${张三},去${把桌子从A地点搬到B地点}”,这样就把关键字给明确的标注出来了,虽然从直观感受上差了那么一点点,但却是关键字驱动中很重要的一部分。接下来的问题转变成为了对一段字符串中${}的解析了:

    正则类:

    public class RegExp {

    public boolean match(String reg, String str) {

    return Pattern.matches(reg, str);

    }

    public List find(String reg, String str) {

    Matcher matcher = Pattern.compile(reg).matcher(str);

    List list = new ArrayList();

    while (matcher.find()) {

    list.add(matcher.group());

    }

    return list;

    }

    }

    获取关键字类:

    public class ParseKeyword {

    public List getKeywords(String p){

    String reg = "(?<=(?

    RegExp re = new RegExp();

    List list = re.find(reg, p);

    return list;

    }

    public static void main(String[] args) {

    ParseKeyword p = new ParseKeyword();

    System.out.println(p.getKeywords("a${a}a"));

    System.out.println(p.getKeywords("a\\${a}a"));

    System.out.println(p.getKeywords("a${a\\}a"));

    System.out.println(p.getKeywords("a${a\\}a}a"));

    System.out.println(p.getKeywords("a${a}a${"));

    System.out.println(p.getKeywords("a${ab}a${a}"));

    }

    }

    说明:里面用到了正则预查模式,正则预查模式是正则中的一种相对高阶的用法,掌握这个后,你的正则就会上一个台阶。

    4. 执行引擎:

    执行引擎先要找到需要执行的语句,所以,首先应该把老师发的那个命令给读取出来,这个命令可以存放在任何格式的文件里,只要能被读出来即可,在这里我们保存在command.txt里:

    读取这个命令:

    public class Executor {

    public List readTxtFile(String filePath) {

    List list = new ArrayList();

    try {

    String encoding = "UTF8";

    File file = new File(filePath);

    if (file.isFile() && file.exists()) {

    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);

    BufferedReader bufferedReader = new BufferedReader(read);

    String lineTxt = null;

    while ((lineTxt = bufferedReader.readLine()) != null) {

    list.add(lineTxt);

    }

    read.close();

    bufferedReader.close();

    } else {

    System.out.println("找不到指定的文件");

    }

    } catch (Exception e) {

    System.out.println("读取文件内容出错");

    e.printStackTrace();

    }

    return list;

    }

    public static void main(String[] args) {

    Executor e = new Executor();

    System.out.println(e.readTxtFile("src/command.txt"));

    }

    }

    读取之后,流程就是:获取关键字->获取关键方法->执行关键方法.

    public class Executor {

    private ParseKeyword pk = new ParseKeyword();

    public List readTxtFile(String filePath) {

    List list = new ArrayList();

    try {

    String encoding = "UTF8";

    File file = new File(filePath);

    if (file.isFile() && file.exists()) {

    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);

    BufferedReader bufferedReader = new BufferedReader(read);

    String lineTxt = null;

    while ((lineTxt = bufferedReader.readLine()) != null) {

    list.add(lineTxt);

    }

    read.close();

    bufferedReader.close();

    } else {

    System.out.println("找不到指定的文件");

    }

    } catch (Exception e) {

    System.out.println("读取文件内容出错");

    e.printStackTrace();

    }

    return list;

    }

    public void executor(){

    List commands = this.readTxtFile("src/command.txt");

    for (String command : commands) {

    List keywords = pk.getKeywords(command);

    for (String keyword : keywords) {

    this.invoke(keyword);

    }

    }

    }

    public void invoke(String keyword){

    Map keyMethod = KeywordReflect.KEYWORD_POOLS.get(keyword);

    String className = keyMethod.get("class");

    String methodName = keyMethod.get("method");

    Object obj = RegisterCenter.OBJ_POOLS.get(className);

    Method method = this.getMethod(methodName, obj);

    try {

    method.invoke(obj);

    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

    e.printStackTrace();

    }

    }

    private Method getMethod(String methodName, Object obj) {

    try {

    Method[] methods = obj.getClass().getMethods();

    for (Method m : methods) {

    if (m.getName().equals(methodName)) {

    return m;

    }

    }

    } catch (SecurityException e) {

    return null;

    }

    return null;

    }

    public static void main(String[] args) {

    Executor e = new Executor();

    e.executor();

    }

    }

    为了大家能够看到执行结果,把MoveDesk类给改改:

    public class MoveDesk {

    public void setZhangsan() {

    System.out.println("this is zhangsan");

    }

    public void moveDeskFromA2B(){

    System.out.println("this is test!");

    }

    }

    这样执行之后,就能看到这两个关键方法体被执行了!执行引擎中最关键的就是利用了JAVA的反射来执行方法!

    以上的代码经过测试运行通过!

    由此一个最最简单的关键字驱动架子就搭建完成了,还有如下的一些点需要大家自行去完成:关键方法参数处理,关键方法返回值处理,异常处理,结合数据驱动,结合测试框架(TESTNG/JUNIT)等。也有很大的优化空间留给大家自行发挥去吧!

    展开全文
  • 龙源期刊网http://www.qikan.com.cn基于关键字驱动的Web自动化测试的研究作者:朱宏峰来源:《硅谷》2009年第24期[摘要]研究与设计以Selenium测试工具为基础,运用关键字驱动技术,web应用的自动化测试框架。...

    龙源期刊网

    http://www.qikan.com.cn

    基于关键字驱动的

    Web

    自动化测试的研究

    作者:朱宏峰

    来源:《硅谷》

    2009

    年第

    24

    [

    摘要

    ]

    研究与设计以

    Selenium

    测试工具为基础

    ,

    运用关键字驱动技术

    ,web

    应用的自动化测

    试框架。

    [

    关键词

    ]

    关键字驱动

    WebSelenium

    中图分类号

    :TP3

    文献标识码

    :A

    文章编号

    :1671-7597(2009)1220051-01

    一、自动化测试技术概述

    (

    )Web

    测试概述。随着互联网和

    Web

    技术的进步

    ,Web

    应用频繁出现在人们工作生活

    中。作为用户

    ,

    优秀的

    Web

    应用为工作与生活带来了很多便利与快乐。作为软件开发测试人

    ,Web

    应用系统的测试、确认和验收是一项重要而富有挑战性的工作。

    Web

    的系统测试与传

    统的软件测试不同

    ,

    它不但需要检查和验证是否按照设计的要求运行

    ,

    而且还要测试系统在不同

    用户的浏览器端的显示是否合适。重要的是

    ,

    还要从最终用户的角度进行安全性和可用性测

    试。

    (

    )

    自动化测试技术的发展。软件自动化测试技术的发展一般分为

    3

    :

    第一代

    :

    录制和回放。由测试工具记录你所做的每一步操作

    ,

    加以录制并回放出来。测试工

    具起到了一个录像机的作用

    ,

    虽然操作异常简单

    ,

    并且可以达到自动化测试的基本要求

    ,

    但是缺少

    灵活性

    ,

    自身没有判断能力

    ,

    容易记录一些无用操作

    ,

    并且维护费用比较高

    ,

    一旦界面改变

    ,

    脚本就

    将重新制作。

    第二代

    :

    数据驱动。从专有的数据文件中读取数据

    ,

    并将这些测试数据放入测试脚本中

    ,

    不同

    的数据文件对应不同的测试用例。和第一代相比

    ,

    提高了脚本的利用率

    ,

    但是同样受到被测软件

    界面变化的影响。

    第三代

    :

    关键字驱动。关键字驱动测试是数据驱动测试的一种改进类型

    ,

    它将测试逻辑按照

    关键字进行分解

    ,

    形成数据文件

    ,

    关键字对应封装的业务逻辑。主要关键字包括三类

    :

    被操作对象

    (Item)

    、操作

    (OperatiOn)

    和值

    (value),

    用面向对象形式可将其表现为

    Item.operation(value)

    展开全文
  • 关键字驱动测试是数据驱动测试的一种改进类型2. 主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(value),用面向对象形式可将其表现为Item.Operation(Value)3. 将测试逻辑按照这些关键字进行分解,形成...

    一、原理及特点

    1.   关键字驱动测试是数据驱动测试的一种改进类型

    2.    主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(value),用面向对象形式可将其表现为Item.Operation(Value)

    3.   将测试逻辑按照这些关键字进行分解,形成数据文件。

    4.    用关键字的形式将测试逻辑封装在数据文件中,测试工具只要能够解释这些关键字即可对其应用自动化

    二、准备

    使用工具:eclipse

    用到的第三方jar包:poi.jar(操作excel);selenium.jar

    理解难点:java反射机制;逐步分层

    三、框架构思

    1、编写脚本

    首先我们来写一个登陆开源中国的脚本

    public class Login_Script {

    public static WebDriver driver=null;

    public static void main(String []agrs) throws InterruptedException{

    //                启动火狐浏览器

    driver= new FirefoxDriver();

    //                最大化

    driver.manage().window().maximize();

    //                打开开源中国网址

    driver.get("http://www.oschina.net/");

    //                点击登录

    driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[1]")).click();

    //                输入用户名

    driver.findElement(By.xpath("//*[@id='f_email']")).sendKeys("XXXXXXB");

    //                输入密码

    driver.findElement(By.xpath("//*[@id='f_pwd']")).sendKeys("XXXXXXXA");

    //                点击登录按钮

    //                driver.findElement(By.xpath("//*[@id='login_osc']/table/tbody/tr[7]/td/input")).click();

    //                Thread.sleep(30);

    //                点击退出按钮

    driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[3]")).click();

    //                关闭浏览器

    driver.quit();

    }

    }

    2、脚本分析

    这是登陆的场景

    操作步骤

    第一步:启动浏览器

    第二步:输入网址

    第四步:点击登录

    第五步:输入用户名

    第六步:输入密码

    第七步:点击登录按钮

    第八步:点击退出

    第九步:关闭浏览器

    3、使用excel

    建立一个excel

    在java中创建一个操作excel的类 ,主要实现是对excel的读和写,主要代码如下:

    public class ExcelUtils {

    public static HSSFSheet ExcelSheet;

    public static HSSFWorkbook    ExcelBook;

    public static HSSFRow Row;

    public static HSSFCell    Cell;

    public static void setExcelFile(String Path,String    SheetName) throws Exception{

    FileInputStream    ExcelFile=new FileInputStream(Path);

    ExcelBook=new HSSFWorkbook(ExcelFile);

    ExcelSheet=ExcelBook.getSheet(SheetName);

    }

    public static void setCellData(String Result,  int RowNum, int ColNum,String Path) throws Exception{

    Row  = ExcelSheet.getRow(RowNum);

    Cell = Row.getCell(ColNum, Row.RETURN_BLANK_AS_NULL);

    if (Cell == null) {

    Cell = Row.createCell(ColNum);

    Cell.setCellValue(Result);

    } else {

    Cell.setCellValue(Result);

    }

    FileOutputStream fileOut = new FileOutputStream(Path);

    ExcelBook.write(fileOut);

    fileOut.flush();

    fileOut.close();

    }

    public static String getCellDate(int RowNum,int CloNum){

    Cell=ExcelSheet.getRow(RowNum).getCell(CloNum);

    String cellData=Cell.getStringCellValue();

    return cellData;

    }

    }

    4、新建一个ActionKeyWords类

    public class ActionKeyWords {

    public static WebDriver driver=null;

    //    启动浏览器并最大化

    public static void OpenBrowser (){

    driver= new FirefoxDriver();

    driver.manage().window().maximize();

    }

    //    打开开源中国网址

    public static void Navigate (){

    driver.get("http://www.oschina.net/");

    }

    //    点击登录

    public static void Login_Click (){

    driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[1]")).click();

    }

    //    输入用户名

    public static void Input_Name (){

    driver.findElement(By.xpath("//*[@id='f_email']")).sendKeys("XXXXXXA");

    }

    //    输入密码

    public static void Input_Password (){

    driver.findElement(By.xpath("//*[@id='f_pwd']")).sendKeys("XXXXXXB");

    }

    //    点击登录按钮

    public static void Login_Button (){

    driver.findElement(By.xpath("//*[@id='login_osc']/table/tbody/tr[7]/td/input")).click();

    }

    //    点击退出按钮

    public static void Logout_Click (){

    driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[3]")).click();

    }

    //    关闭浏览器

    public static void CloseBrowser (){

    driver.quit();

    }

    }

    5、修改Login_Script脚本.

    public class Login_Script {

    public static void main(String []agrs) throws Exception{

    ExcelUtils.setExcelFile("D:\\data\\TestData.xls", "steps");

    ActionKeyWords actionKeyWords= new ActionKeyWords();

    String Keywords=null;

    for(int RowNum=1;RowNum<=ExcelUtils.getLastRowNums();RowNum++){

    Keywords=ExcelUtils.getCellDate(RowNum, 3);

    if(Keywords.trim().equals("OpenBrowser")){

    actionKeyWords.OpenBrowser();

    }else if(Keywords.trim().equals("Navigate")){

    actionKeyWords.Navigate();

    }else if(Keywords.trim().equals("Login_Click")){

    actionKeyWords.Login_Click();

    }else if(Keywords.trim().equals("Input_Name")){

    actionKeyWords.Input_Name();

    }else if(Keywords.trim().equals("Input_Password")){

    actionKeyWords.Input_Password();

    }else if(Keywords.trim().equals("Login_Button")){

    actionKeyWords.Login_Button();

    }else if(Keywords.trim().equals("Logout_Click")){

    actionKeyWords.Logout_Click();

    }else if(Keywords.trim().equals("CloseBrowser")){

    actionKeyWords.CloseBrowser();

    }

    }

    }

    }

    这样代码的框架就基本已经搭建起来了,代码结构如下:

    四、结构优化

    1、优化Login_Script 类中的代码

    注:这里用到了反射机制

    public class Login_Script {

    public static ActionKeyWords actionKeyWords;

    public static String Keywords=null;

    public static Method[] method;

    public Login_Script(){

    actionKeyWords= new ActionKeyWords();

    method=actionKeyWords.getClass().getMethods();

    }

    public static void main(String []agrs) throws Exception{

    ExcelUtils.setExcelFile("D:\\data\\TestData.xls", "steps");

    new Login_Script();

    for(int RowNum=1;RowNum<=ExcelUtils.getLastRowNums();RowNum++){

    Keywords=ExcelUtils.getCellDate(RowNum, 3);

    login_action();

    }

    }

    public static void login_action(){

    for(int i=0;i

    //                    System.out.println(method[i].getName()+"     "+actionKeyWords+Keywords);

    if(method[i].getName().trim().equals(Keywords)){

    try {

    method[i].invoke(actionKeyWords);

    } catch (IllegalAccessException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IllegalArgumentException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (InvocationTargetException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    }

    }

    2、将程序中的常量统一管理

    例如:网页的地址,账户、密码,excel路径,这里我们在文件下面建立一个

    public class Contants {

    public static  String url="http://www.oschina.net/";

    public static String excelFile="D:\\data\\";

    public static String excelName="TestData.xls";

    public static String excelSheet="steps";

    public static int excelKWCloNum=3;

    public static String userName="XXXXXXXA";

    public static String userPassword="XXXXXB";

    }

    3、增加对象库

    下面我们看一下ActionKeyWords类中定位元素的路径 是在代码里面的,如果每次去修改的定位路径的是时候都要修改代码,为了便于维护,我们将这些元素的对象放在一个文件中,同时我们在Excel增加一列 Page Objects,这样程序根据Excel中的Page Objects,去文件中读取相应的元素,这里我们增加一个类OrpUtil,读取元素的对象

    # Home Page Objects

    Userbar_login=//*[@id='OSC_Userbar']/a[1]

    Userbar_logout=//div[@id='OSC_Userbar']/a[3]

    #Login Page Objects

    Input_name=//*[@id='f_email']

    Input_password=//*[@id='f_pwd']

    Login_button=//*[@id='login_osc']/table/tbody/tr[7]/td/input

    //OrpUtil类

    public class OrpUtil {

    public static String  readValue(String a){

    Properties pro=new Properties();

    String popath=Contants.ObjectReUrl;

    String value=null;

    try {

    InputStream in =new BufferedInputStream(new FileInputStream(popath));

    pro.load(in);

    value=pro.getProperty(a);

    } catch (FileNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return value;

    }

    }

    优化后的ActionKeyWords类

    public class ActionKeyWords {

    public static WebDriver driver=null;

    //    启动浏览器并最大化

    public static void OpenBrowser (String OR){

    System.setProperty("webdriver.chrome.driver", ".//server//chromedriver.exe");

    driver= new ChromeDriver();

    driver.manage().window().maximize();

    }

    //    打开开源中国网址

    public static void Navigate (String OR){

    driver.get(Contants.url);

    }

    //    点击登录

    public static void Login_Click (String OR){

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();

    }

    //    输入用户名

    public static void Input_Name (String OR){

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).clear();

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).sendKeys(Contants.userName);

    }

    //    输入密码

    public static void Input_Password (String OR){

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).sendKeys(Contants.userPassword);

    }

    //    点击登录按钮

    public static void Login_Button (String OR){

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();

    }

    //    点击退出按钮

    public static void Logout_Click (String OR){

    try {

    Thread.sleep(300);

    driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    //    关闭浏览器

    public static void CloseBrowser (String OR){

    driver.quit();

    }

    }

    这个OR的值是从Excel中读取的

    4、增加测试场景

    从Excel中我们可以看到,这操作是对应的用例编写中的我们的操作步骤,在用例设计的时候还有测试场景和结果,这里

    我们先增加个场景在EXCEL中增加一个名称为Suite的Sheet页

    我们程序的运行逻辑是循环读取Suite页中的Runmode,当为YES时根据对应的TestSuiteID去读取对应的Steps页中的操作在步骤,进行运行

    public static void main(String []agrs) throws Exception{

    ExcelUtils.setExcelFile(Contants.excelFile+Contants.excelName );

    new Login_Script();

    bResult = true;

    //循环读取suitSheet里面的值,找出运行的场景

    for(int j=1;j<=ExcelUtils.getLastRowNums(Contants.suitSheet);j++){

    String Runmode=ExcelUtils.getCellDate(j, Contants.suitRunmode,Contants.suitSheet);

    String suitTestSuiteId=ExcelUtils.getCellDate(j, Contants.suitTestSuiteId,Contants.suitSheet);

    int sRowNum;

    if(Runmode.equals("YES")){

    //根据stepTestSuiteId在caseSheet中循环查找相对应的执行步骤

    for(sRowNum=1;sRowNum<=ExcelUtils.getLastRowNums(Contants.caseSheet);sRowNum++){

    String stepTestSuiteId=ExcelUtils.getCellDate(sRowNum, Contants.stepTestSuiteId,Contants.caseSheet);

    System.out.println(ExcelUtils.getCellDate(sRowNum, Contants.excelKWCloNum,Contants.caseSheet));

    if(stepTestSuiteId.trim().equals(suitTestSuiteId)){

    Keywords=ExcelUtils.getCellDate(sRowNum, Contants.excelKWCloNum,Contants.caseSheet);

    r=ExcelUtils.getCellDate(sRowNum, Contants.excelPOCloNum,Contants.caseSheet);

    login_action(sRowNum);

    if(bResult == false){

    ExcelUtils.setCellData(Contants.fail, j, Contants.suitResult,Contants.excelFile+Contants.excelName, Contants.suitSheet);

    }

    }

    }

    if(bResult == true){

    ExcelUtils.setCellData(Contants.pass, j, Contants.suitResult,Contants.excelFile+Contants.excelName, Contants.suitSheet);

    }

    }else{

    System.out.println("没有要执行的用例");

    break;

    }

    }

    }

    5、增加测试结果

    在Excel中新增一列Resut

    在Login_Script中定义一个boolean类型的变量bResult,默认是true在各个地方try,,cacth,当出现异常的时候在bResult赋值为false,在Excel工具类中增加一个写入excel值得方法

    五、小结

    这样我们的关键字驱动框架就初步搭好了,下面我们回归一下基本思路:

    转自:http://my.oschina.net/hellotest/blog/531932

    展开全文
  • a.数据驱动:从某个数据文件(odbc,csv,excel...关键字驱动:从面向对象角度出发,同样业务逻辑编写成一个类或者函数作为关键字被不同的脚本调用每个步骤对应文件中一行内容c.DDT:官网参考:https://ddt.readthedocs...
  • 序本篇旨在通过一个基础demo的实现讲解,提供一个关键字驱动框架实现方案的思路指引。为什么要实现关键字驱动框架?其实之前已经介绍过纯代码方式的自动化框架实现,那为什么还要去进行关键字框架的实现呢?纯代码...
  • 0引言软件测试是保障和提高软件质量的重要手段[1]。软件开发者和使用者必须对软件进行充分的测试,以确保其正常...实践证明,软件自动化测试技术提高了软件测试的速度和效率,节省了软件测试成本,缩短了产品发布...
  • 原文转自:http://blog.csdn.net/u010202588/article/details/38639811初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄须,不就是参数和函数其嘛!其实其也体现了测试所不同与开发的一些特点...
  • 操作浏览器的方法都固定下来,不...1.关键字驱动框架是一种功能自动化测试框架被称为表格驱动测试被称为基于动作字的测试。2.关键字驱动的框架的重要组成部分测试步骤(Test Step),测试步骤中的对象(Test ...
  • 要实现python自动化测试,最根本的方法:关键字驱动,也就是selenium二次封装。 python小白学习过程如下: 看视频学习关键字驱动,再结合项目进行实际操作。
  • 放在这里是为了以后有需要的时候,能够快速的搭建关键字驱动自动化框架。 实现功能:成功登录qq邮箱,点击“写信”,给好友发送邮件。关键字驱动的实现原理就是利用了java的反射机制P.S如果我写的不太清楚,建议...
  • 关键字驱动测试框架案例框架分析:1.使用外部测试数据文件,使用Excel管理测试用例的集合和每个测试用例的所有测试步骤,实现一个文件中完成测试用例的维护2.每个测试用例的测试结果在一个文件中查看和统计3.通过...
  • def test_gestureUnlock(self):#time.sleep(5)el1 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[10]")print el1time.sleep(2)el2 = self.driver.find_element_by_xpath("//UIA...
  • 文章目录自动化测试的实施策略单元测试框架数据驱动设计模式核心原理适用场景代码示例关键字驱动设计模式混合模式驱动设计模式其他设计模式浅谈 自动化测试的实施策略 单元测试框架 数据驱动设计模式 核心原理 适用...
  • 自动化脚本之关键字驱动脚本

    千次阅读 2017-10-25 14:51:59
    第48贴:自动化脚本之关键字驱动脚本 关键字驱动实际上是比较复杂的数据驱动技术的逻辑扩展。将数据文件变成测试用例的描述,用一系列关键字指定要执行的任务。在关键字驱动技术中,假设测试者具有某些被测系统的...
  • 关键一种关键字驱动自动化测试框架软件测试摘要:为了提高软件自动化测试脚本的可复用性,提出了一种基于关键字驱动自动化测试框架(LKDT)。首先对目前现有自动化测试框架进行了归纳分析;然后提出了LKDT的系统...
  • 自动化测试现在越来越趋向于平台化,平台化是致力于协同工作,提高效率,让更多人参与自动化的一个过程,在我看来,平台化中,有一个更为关键点,就是关键字驱动,只有把自动化测试的代码转换成为大家更容易懂的自然...
  •  一、关键字驱动KDT(Keyword-driven testing) 1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段,它是当前比较流行的一种框架之一,并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。...
  • 关键字驱动测试(Keyword driver testing)也被称为表格驱动测试或者基于动作字的测试,工作中经常遇到的KDT测试工具有很多,比如Selenium IDE、Katalon Recorder、UFT等。关键字驱动的核心就是对测试用例(步骤)进行...
  • 个人理解自动化测试中关键字驱动的目的就是为了让更多的人参与到自动化测试中来,提高测试效率,关键字驱动框架搭建完成时候,使用起来对没有技术基础的同学来说也是十分简单的 摘录网上的一个例子: 老师对着同学...
  • 1、自动化实现一个端对端的流程 2、区分和实现动作的关键字 3、设置数据引擎-Excel表 4、实现java反射类 5、设置java常量,一些固定的数据 6、设置元素对象仓库文件 7、设置测试套件执行引擎 8、设置日志模...
  • 关键字驱动自动化测试PPT,PPT robot rafs 自动化测试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,357
精华内容 542
关键字:

自动化关键字驱动