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

持续关注,会抽时间继续封装多种工具类以及日志、报告框架等的封装。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。