九、工具类,启动所有远程服务的浏览器

  在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();
} }

运行后打印结果如下:

      aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAChCAIAAADP8SPfAAAHjUlEQVR4nO2d25XrIAxFXVcKSj2pJs1ME7cD7ocTB1sPBJiXpPM1QYR42EgGrIW3f//+BZdebTYBb9t2e836b7WQFcCXHs8CwFfeIpW131RWAIdzpycBbKyyfmusYsB/r8f5/3i8/lDDtzyE9xMrHar9Yp9vYLgA5rExhOQOLR8Q7YR48Pt57Z+/1wPrsb/X40f19GGU3s9te7xe4B84C+3xuwDDOusCPleEX+ut93O/gNSVwB5HSyQhmjLpALxHw91td9+ZIkbzgIVdn0WFHzGLAI4VW7934agsvjHH32hdTv8D+78qcFyJSVJ5QcC8B7+f2/QeXAAYRuBdaCMU1HUBw3vwL1zP5sEUXar3GSsFOAhg91cF4Mu8eYppdAjhBsAoJ7Qp1LmZEdBftR58lJ8+jBX4Byi6SavEg6FpWsCVGx3D6YLr/15osscp3tBBDzelxDfeX4a2KnfxN93iQtSUHA0dZA6wNTlg5XLAyuWAlcsBK5dRwPLJbdk0ePjk+ZAVwDWbD8mFL1wfO+ABygJAbXEIl7ZzAlaQshNdD9hYS25RUZWZdlBrwYBoJ00pO/FlcgkIaI/fBRjWWRfwbCk7JzGEYY+jJZIQTZl0AJ41ZSeEQF+QsOuzqPAjZhHAsSZP2flew4Uvj0FuklReEPBCKTtEanQBYBiBd6GNUFDXBTxpyg462Ci6VO8zVgpwEMDuL20pO9G04KQswCgntCnUuZkR0F+qUnZy6SatEg+GpmkBr56yQ4buZI9TvKGDHm5KiW+8vwxtVe7ib7rFhagpORo6yBxga3LAyuWAlcsBK5cDVi4HfJJ80ls2Pe4/qbYOuGZTIrkghutmBzxAWQCorQ/hkncs4IKdrEA9uvntKo3fn95l9PSdqseF1Kk20cPYv9djkk1Mo6fvVD5sQE+1eT9jtx2f62H69J06D0a/cPr4ie7DfTgEo6fvVKfswC8cDvwJz8fwGJ3KY/L0nTYe/Hi9f49mE9/uJ5On7zQK0ddnxtN6MEWX6n3GSgEOAtjt1ADwZeI8jQPbPH2nAeAJl0m7TJ6+U7PRQZ5qczKNp2v69B3fqvyIv+kWF6Km5Gi4UQ5YuRywcjlg5XLAyuWAlcsoYPkktmy6222SnJQVwDWbDMkFLlwHO+ABygJAbWUIl7BzAl7+lJ3TdfopO/v1KDplJxb3cB/t8bsAwzrrAp75lB1uvMEeR0skIZoy6QA88Sk7NF9h12dR4UfMIoBjTXzKzmGDeHkMcpOk8oKAVzplJ6DPoQsAg4H0EdoIBXVdwJOesoNeHUWX6n3GSgEOAtj9pe2UnZ/O2dlZgFFO0BpmSs2hpOqUnUinSR9FN2mVeDA0TQt49VN2yH2OZI9TvKGDHm5KiW+8vwxtVe7ib7rFhagpORo6yBxga3LAyuWAlcsBK5cDVq6JAMsnnMVLkeFz2v5qBTi53VNT3wHL1dCDazxSUpnahZBUEO5aKFDDlJ1cr5LUpyq7B1OaKGVHCBj1PAdMqXnKjjA2JuOqvLLw12FllWqSspPrZFRfywuZluUfVapFys63aVlvbuJH60wjlBxww5SduPs2YnKEVmYKL9HVQ3RSLVJ2vk3nzHjLorHcxeM4YYHroYYpO4yTCcHcBRgONTuMG6bsMJ1YCTgO0VktU38rVquUndxgKAR88X4+NsBQAT+qx9xkqzLJQNj1d4VooVWlJnqa5GohB6xcDli5HLByOWDlcsAnVa7rGn2rRtYB86u1rO9CK7o0z73CSlkHHDK3t5hlvQTeWMCKX4wV7bgZO33Hwoux4svnzhJBe/wuwLDO/IBXeTHWSczlwB5HSyQhmjKtBZj4wrQvxgoh0ICFXZ9FhR8xkwGOteiLsb7XymSeUCUSk6TyxIAVvBiLmA8WAIYROI7Dl0YoqCsD3mZ8MRZ61BNFl+p9xkoBDgLY7WTlxVhRhu9JWYBRTmhTqHMzI6CdTLwYK5du0irxYGgaDljri7HI0J3scYo3dNDDTSnxjbeTb1V+xN90iwtRU3I03CgHrFwOWLkcsHI5YOVywMrlgE+ST27LpsHdJs+/XzQOuGbzIbnwhetjBzxAWQCoLQ7h0nYsYLUpO5ZfmGUhZSeWuRdmWUvZMffCLGMpO/ZemGUlZcfsC7NMpewEgy/MMpSyg14tRZfqfcZKAQ4C2O1kJWXnJ2MvzDKRshPJ3AuzLKTsmH5hlm9VfsTfdIsLUVNyNNwoB6xcDli5HLByOWDlcsDKtQBg+YSzeCnSbU7bX70BJ7d7auo7YKgBHlzjkZLK1C6EpIJw12IhDUjZyfUqSX2qsnvwAik7QsCo5zngYSk7wtiYjKvyysJfh5WXVteUnVwno/paXsi0LP+4tHqm7Hx/Utabm/jROtMIJQfcMGUn7r6NmByhlZnCS3T1EH2oZ8rO9ydzZrxl0Vju4nGc0MT10ICUHcbJhGDuAgyHmj7GA1J2mE6sBByH6KyWqb8VqHfKTm4wFAK+eD8fG2CogB/VYO66VZlkIOz6ZO8LI4HQurQWeJrkqpEDVi4HrFwOWLkcsHI5YOVywMrlgJXLASuXA1YuB6xcDli5HLBy/Qc7uG4NNLpe/QAAAABJRU5ErkJggg==" alt="" />

备注:所有java包及类创建完目录如下:

      aaarticlea/png;base64,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" alt="" />

可自行对比。

至此,selenium之多线程启动grid分布式测试框架封装 ,封装完成。

源码jar:http://yunpan.cn/cKacLZvv4BA3Q  访问密码 c81b

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

selenium之多线程启动grid分布式测试框架封装(四)的更多相关文章

  1. selenium之多线程启动grid分布式测试框架封装(一)

    一.设计思路 在国内市场上,IE内核的浏览器占据了绝大部分的市场份额,那么此次框架封装将进行IE系列的浏览器进行多线程并发执行分布式测试的封装. 运行时主进程与多线程关系如下:

  2. selenium之多线程启动grid分布式测试框架封装(三)

    七.工具类,线程监控器类创建 utils包中,创建java类:RemoteThreadStatusMonitor.java package com.lingfeng.utils; /** * 此监控器 ...

  3. selenium之多线程启动grid分布式测试框架封装(二)

    五.domain类创建 在domain包中创建类:RemoteLanchInfo.java 用来保存启动信息. package com.lingfeng.domain; public class Re ...

  4. Selenium Grid分布式测试入门详解

    本文对Selenium Grid进行了完整的介绍,从环境准备到使用Selenium Grid进行一次完整的多节点分布式测试. 运行环境为Windows 10,Selenium版本为 3.5.0,Chr ...

  5. Selenium Grid分布式测试环境搭建

    Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成.Hub用来管理各个代理节点的注册信息 ...

  6. python pytest测试框架介绍四----pytest-html插件html带错误截图及失败重测机制

    一.html报告错误截图 这次介绍pytest第三方插件pytest-html 这里不介绍怎么使用,因为怎么使用网上已经很多了,这里给个地址给大家参考,pytest-html生成html报告 今天在这 ...

  7. 大型分布式C++框架《四:netio之buffer管理器 下》

    每周一篇又来了.这次主要介绍netio的buffer管理器. 首先buffer管理是每一个网络层不可回避的问题.怎么高效的使用buffer是很关键的问题.这里主要介绍下我们的netio是怎么处理.说实 ...

  8. 大型分布式C++框架《四:netio之请求包中转站 上》

    本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕. ...

  9. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

随机推荐

  1. debian软件安装基础(同tomcat案件)

    基本介绍 笔者是一个Linux盲.一旦只在虚拟机上载通过Ubantu-图形版本,我看着接口.打了几场比赛卸载的光盘上. 往下看,在过去的几天.试想想,在Linux关于建设nexus(mavenPW)玩 ...

  2. 使用Java快速实现进度条(转)

    基于有人问到怎样做进度条,下面给个简单的做法: 主要是使用JProgressBar(Swing内置javax.swing.JProgressBar)和SwingWorker(Swing内置javax. ...

  3. Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...

  4. Flex里的特效

      Flex中提供了丰富的效果组件.因为效果是一种依据时间渐变的过程,因此全部效果都具有duration属性,用来设置播放时间(以毫秒为单位).也能够通过设置repeatCount属性和repeatD ...

  5. Web Host消息处理管道

    Web Host消息处理管道 前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和 ...

  6. OpenGL缓冲区

    OpenGL缓冲区 颜色缓冲区 OpenGL时,先是在一个缓冲区中完毕渲染,然后再把渲染结果交换到屏幕上. 我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区.在默认情况下,OpenGL命令是在 ...

  7. Storing and Retrieving Images from SQL Server using Microsoft .NET

    原文 Storing and Retrieving Images from SQL Server using Microsoft .NET Download source - 19.6 Kb Intr ...

  8. ACM-凸多边形的计算几何——hrbust1429

    凸多边形 称号:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1429 Descri ...

  9. SWOT分析是神马?

    SWOT分析是思维的工具来理解事物的方式.人生在世,作为一个独立的实体,不可避免地需要思考的问题.除非你是猪.猪比这更聪明.眠质量,都要完爆白领,蓝领和金领们. SWOT分析分为四个象限.我们用一头名 ...

  10. Matlab.NET混合编程技巧之——找出Matlab内置函数

    原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...