从最初开始接触接触 webdriver 的自动化测试工具一来就一直有个小困扰, 那就是调试的时候不是很方便. 其实我们在编写脚本的时候除了设计阶段, 一定的时间是在调试测试步骤和 element 上. 但是常规的写法在调试的时候每次总是要重启 webdriver 包括 seleium 和 appium, 不是很方便. 其实这个功能在一些收费的工具上是作为基本步骤的, 比如 UFT 或者 RFT 等功能自动化工具. 前几天在论坛上看到一位同行写出了一个方式去实现在不重启 webdriver 的情况下能够方便的调试一些操作基于 androiddriver 的, 受到启发. 看孩子和热蒙了之余做了些改动和加了点自己的想法, 写了一个很小的工具, 希望能给测试的同行们提供一点方便.
driver.findElementById("kw").sendKeys("Testerhome");
driver.findElementById("su").click();
我们需要的只是让最开始启动的 webdriver 的 session, 比如浏览器的一直在哪里而不重置或者丢失, 就可以了. 基于此, 就可以随意的执行你的自动化代码, 看起来像动态的方式一样, 所以最开始提到的帖子里面, 同行用的是 java 的 reflect, 随时编译执行而无须重启. 我最早接触这种操作是开始于我做的一个操作数据库的轻量 IDE, 启动和 load 一些驱动和主程序用到反射这个概念, 但是并没有深入的研究它. 这次正好看到这位同行分享的方法, 受到启发, 就简单的扩展了一下.
工具的使用需要你建立两个 java 文件, 一个用来启动 webdriver(没它啥都做不了) 和调用 MteSenseLoader(这个是主要的方法), 一个是用来写你调试代码的 java 文件, 之所以要用 JAVA 文件是为了方便你使用 java ide 那些绚丽的功能, 什么敲点出方法之类的, 方便你操作的.最终你的所有调试 webdriver 的代码都只能写到第二 java 文件的指定方法里.
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();
}
}
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);
}