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
持续关注,会抽时间继续封装多种工具类以及日志、报告框架等的封装。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。