写在前面

从最初开始接触接触 webdriver 的自动化测试工具一来就一直有个小困扰, 那就是调试的时候不是很方便. 其实我们在编写脚本的时候除了设计阶段, 一定的时间是在调试测试步骤和 element 上. 但是常规的写法在调试的时候每次总是要重启 webdriver 包括 seleium 和 appium, 不是很方便. 其实这个功能在一些收费的工具上是作为基本步骤的, 比如 UFT 或者 RFT 等功能自动化工具. 前几天在论坛上看到一位同行写出了一个方式去实现在不重启 webdriver 的情况下能够方便的调试一些操作基于 androiddriver 的, 受到启发. 看孩子和热蒙了之余做了些改动和加了点自己的想法, 写了一个很小的工具, 希望能给测试的同行们提供一点方便.

参考帖子: https://testerhome.com/topics/9040(使用 java 动态加载机制模拟脚本语言的效果)

重点在这

看似理想点的操作方式是这样的, 你想操作 webdriver, 比如 selenium 的 chrome driver :

driver.findElementById("kw").sendKeys("Testerhome");
driver.findElementById("su").click();

其实我们在常规的操作中只是想简单点, 比如:

给个小结论

我们需要的只是让最开始启动的 webdriver 的 session, 比如浏览器的一直在哪里而不重置或者丢失, 就可以了. 基于此, 就可以随意的执行你的自动化代码, 看起来像动态的方式一样, 所以最开始提到的帖子里面, 同行用的是 java 的 reflect, 随时编译执行而无须重启. 我最早接触这种操作是开始于我做的一个操作数据库的轻量 IDE, 启动和 load 一些驱动和主程序用到反射这个概念, 但是并没有深入的研究它. 这次正好看到这位同行分享的方法, 受到启发, 就简单的扩展了一下.

关于这个不是工具的工具

举个栗子

工具的使用需要你建立两个 java 文件, 一个用来启动 webdriver(没它啥都做不了) 和调用 MteSenseLoader(这个是主要的方法), 一个是用来写你调试代码的 java 文件, 之所以要用 JAVA 文件是为了方便你使用 java ide 那些绚丽的功能, 什么敲点出方法之类的, 方便你操作的.最终你的所有调试 webdriver 的代码都只能写到第二 java 文件的指定方法里.

第一个 java 文件例子 (MteSenseWdadTest)

package com.mte.wdd.test;

import com.mte.wdd.main.MteSenseLoader;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.concurrent.TimeUnit;

/**
 * Created by java on 20/07/2017.
 */
public class MteSenseWdadTest {

    ChromeDriver driver;

    @Before
    public void setUp() throws Exception {
        System.setProperty("webdriver.chrome.driver", "./config/chromedriver");
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        driver = new ChromeDriver(capabilities);

        driver.manage().timeouts()
                .pageLoadTimeout(20, TimeUnit.SECONDS);

        driver.manage().timeouts()
                .implicitlyWait(10, TimeUnit.SECONDS);

        driver.manage().timeouts()
                .setScriptTimeout(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }

    @Test
    public void testMain() throws Exception {

        MteSenseLoader loader = new MteSenseLoader();

        loader.senseLoader("chrome","./src/MteSenseInstanceUpdate.java", "MteSenseInstanceUpdate", "http://www.baidu.com", "runDynamicAction", driver);

    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
    }

}

第二个 java 文件例子 (MteSenseInstanceUpdate), 你所有的调试代码都要写到这个文件的 runDynamicAction() 方法里面去.


import org.openqa.selenium.chrome.ChromeDriver;

/**
 * Created by java on 20/07/2017.
 */
public class MteSenseInstanceUpdate {

    public static void runDynamicAction(ChromeDriver driver) {

        driver.findElementById("kw").sendKeys("Testerhome");
        driver.findElementById("su").click();
//        driver.get("http://wwww.baidu.com");

    }

}

必须解释一下

请注意下面的代码

@Test
public void testMain() throws Exception {

    MteSenseLoader loader = new MteSenseLoader();

    loader.senseLoader("chrome","./src/MteSenseInstanceUpdate.java", "MteSenseInstanceUpdate", "http://www.baidu.com", "runDynamicAction", driver);

}

senseLoader 方法有六个参数

开始折腾把

按照栗子的步骤

无图无真相

来点注意事项

最后陈述

最后的最后

如果觉得还对付用, 或者 能给你带来点方便, 请在 github 的项目上 点下 star, 非常感谢.

如果有更好的建议和要求, 可以讨论是否添加, 想法还是有的....


↙↙↙阅读原文可查看相关链接,并与作者交流