selenium之多线程启动grid分布式测试框架封装(四)
九、工具类,启动所有远程服务的浏览器
在utils包中创建java类:LaunchAllRemoteBrowsers
package com.lingfeng.utils;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.dom4j.DocumentException;
import org.openqa.selenium.WebDriver;
import com.lingfeng.staticPage.RemoteServerOpenHomepage;
import com.lingfeng.utils.RemoteServerInit;
/**
* 此类提供启动所有远程服务端浏览器的方法
* @author 凌风
*
*/
public class LaunchAllRemoteBrowsers {
private static String driverName;
/**
* 此方法为浏览器启动入口,启用了此方法就意味着调起了所有远程服务端的浏览器
* @return Map<String,Thread> 包含浏览器名称和所运行的所有线程。key为浏览器名称,value是运行的线程。
*/
public static Map<String,Thread> launch(){
//存储所有正在运行的浏览器名称和线程
Map<String,Thread> threadMap = new HashMap<String, Thread>();
try {
//初始化浏览器配置信息
RemoteServerInit.launchBrowser();
//获取初始化后的所有浏览器启动的driver
Map<String,WebDriver> driverMap = RemoteServerInit.getAllLaunchDriverMap();
//获取启动浏览器的driver以及name
Set<Entry<String, WebDriver>> driverInfoSet = driverMap.entrySet();
Iterator<Entry<String, WebDriver>> driverIterator = driverInfoSet.iterator();
while(driverIterator.hasNext()){
Thread currentThread = launchThread(driverIterator);
threadMap.put(driverName, currentThread);
}
return threadMap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return threadMap;
}
/**
* 多线程调用,启动一个线程
* @param driverIterator
* @return Thread 当前启动的线程
*/
private static Thread launchThread(Iterator<Entry<String, WebDriver>> driverIterator) {
Entry<String, WebDriver> driverEntry = driverIterator.next();
driverName = driverEntry.getKey();
WebDriver webdriver = driverEntry.getValue();
RemoteServerOpenHomepage homepage= new RemoteServerOpenHomepage(webdriver,driverName);
Thread t = new Thread(homepage);
t.start();
return t;
}
}
十、开始测试类来喽
在start包中创建java类:StartTest
package com.lingfeng.start;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.lingfeng.utils.LaunchAllRemoteBrowsers;
import com.lingfeng.utils.RemoteThreadStatusMonitor;
public class StartTest {
public static void start(){
Map<String, Thread> allRunningThreads = LaunchAllRemoteBrowsers.launch();
Set<Entry<String,Thread>> RunningThreadsSet = allRunningThreads.entrySet();
Iterator<Entry<String,Thread>> it = RunningThreadsSet.iterator();
int threadCount=0; //记录启动线程个数
while(it.hasNext() ){
threadCount++;
Entry<String, Thread> entry = it.next();
//启动监控器线程,监控运行线程的状态。
RemoteThreadStatusMonitor c = new RemoteThreadStatusMonitor(entry.getKey(),entry.getValue());
Thread t = new Thread(c);
t.start();
}
//消亡线程个数等于了启动线程的个数则jvm退出。
while(RemoteThreadStatusMonitor.getDeadThreadCount()!=threadCount){
//必须加此线程休眠方法,不然主这个线程结束不了。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在调试此类时需要了一个问题,可能是小弟的java的基础还是不够扎实,问题如下:
//消亡线程个数等于了启动线程的个数则jvm退出。
while(RemoteThreadStatusMonitor.getDeadThreadCount()!=threadCount){
//必须加此线程休眠方法,不然主这个线程结束不了。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
在上边这段代码中,如果我不加入sleep方法,while循环中什么都不放的话,主进程就不会结束,加上就没事了,所有工作的线程结束后,主进程自然就结束了,目前还没有弄清楚原因。如有高手看到此文,希望能够给予解惑,感激不尽!
十一、junit测试
junit包中,直接创建一个测试类即可。
package com.lingfeng.junit;
import org.junit.Test;
import com.lingfeng.start.StartTest;
public class JunitTest {
@Test
public void testStart(){
StartTest.start();
}
}
运行后打印结果如下:
备注:所有java包及类创建完目录如下:
可自行对比。
至此,selenium之多线程启动grid分布式测试框架封装 ,封装完成。
源码jar:http://yunpan.cn/cKacLZvv4BA3Q 访问密码 c81b
持续关注,会抽时间继续封装多种工具类以及日志、报告框架等的封装。
大周出品

浙公网安备 33010602011771号