`
shijunjuan
  • 浏览: 47036 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

搭建Selenium Grid压力测试环境

阅读更多
  1. In one machine, run registry file MaxUserPort.reg
  2. Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
    "EnableICMPRedirect"=dword:00000000
    "TcpTimedWaitDelay"=dword:0000001e
    "MaxUserPort"=dword:0000ea60
    "DisableIPSourceRouting"=dword:00000002
    "EnableDeadGWDetect"=dword:00000000
    "KeepAliveTime"=dword:000493e0
    "TcpMaxDataRetransmissions"=dword:00000004
     
         
/**
 * @author junjshi, created on Sep 3, 2013
 * 
 */


import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.testng.annotations.Test;

import com.ebay.maui.controller.TestPlan;
@Test
public class GridTest extends TestPlan{
	private static String browser="firefox";
	
	private static final int threadPoolSize = 200;
	private static int count = 0;
	private static String profilePath = "C:\\grid\\profile\\customProfileDirCUSTFF";
	private static String url = "http://gear2-hub-8915.phx-os1.stratus.dev.ebay.com:8080/wd/hub";
	private static final int interval = 2;//minutes
	
	public static void main(String[] args) {
		ExecutorService exec = Executors.newFixedThreadPool(threadPoolSize);
		CommonTest.setUrl(url);
		CommonTest.setProfilePath(profilePath);
		CommonTest.setInterval(interval);
		Runnable task = new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						
						System.out.println("Clean "+System.getProperty("java.io.tmpdir"));
						File tempDir = new File(System.getProperty("java.io.tmpdir"));
						CommonTest.deleteDirectory(tempDir);
						System.out.println("Executing thread #"+ count++);
						new CommonTest().testGrid(browser);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		};

		for (int i = 0; i < threadPoolSize; i++) {
			exec.execute(task);
		}
	}

	

}
 
 CommonTest.java 
import java.io.File;
import java.net.MalformedURLException;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.openqa.selenium.WebDriver;

import com.ebay.maui.driver.web.WebUXDriver;

/**
 * @author junjshi, created on Dec 9, 2013
 * 
 */

public class CommonTest {
	private static String profilePath = "C:\\grid\\profile\\customProfileDirCUSTFF";
	private static String url = "http://gear2-hub-8915.phx-os1.stratus.dev.ebay.com:8080/wd/hub";
	private static int interval = 2;//minutes
	
	
	
	public static void setInterval(int interval) {
		CommonTest.interval = interval;
	}

	public static String getProfilePath() {
		return profilePath;
	}

	public static void setProfilePath(String profilePath) {
		CommonTest.profilePath = profilePath;
	}

	public static String getUrl() {
		return url;
	}

	public static void setUrl(String url) {
		CommonTest.url = url;
	}

	public static int getInterval() {
		return interval;
	}

	public void runTest(String url) throws MalformedURLException{
		WebUXDriver.getWebUXDriver().setMode("ExistingGrid");
		WebUXDriver.getWebUXDriver().setHubUrl(url);
		WebUXDriver.getWebUXDriver().setFfProfilePath(profilePath);
		WebDriver driver = WebUXDriver.getWebDriver(true);
		driver.get("http://www.qa.ebay.com");
		driver.get("http://www.qa.ebay.com");
		driver.get("http://www.qa.ebay.com");
		System.out.println(driver.getTitle());
		try{
			driver.quit();
		}catch(Exception ex){}
	}
	
	public void runChromeTest(String url) throws MalformedURLException{

		WebUXDriver.getWebUXDriver().setBrowser("chrome");
		WebUXDriver.getWebUXDriver().setMode("ExistingGrid");
		WebUXDriver.getWebUXDriver().setHubUrl(url);
		WebDriver driver = WebUXDriver.getWebDriver(true);
		driver.get("http://www.qa.ebay.com");
		driver.get("http://www.qa.ebay.com");
		driver.get("http://www.qa.ebay.com");
		System.out.println(driver.getTitle());
		try{
			driver.quit();
		}catch(Exception ex){}
	}
	
	public void runIETest(String url) throws MalformedURLException{

		WebUXDriver.getWebUXDriver().setBrowser("iexplore");
		WebUXDriver.getWebUXDriver().setMode("ExistingGrid");
		WebUXDriver.getWebUXDriver().setHubUrl(url);
		WebDriver driver = WebUXDriver.getWebDriver(true);
		driver.get("http://www.qa.ebay.com");
		System.out.println(driver.getTitle());
		try{
			driver.quit();
		}catch(Exception ex){}
	}
	
	public void testGrid(String browser) throws MalformedURLException, InterruptedException{
		ExecutorService exec = Executors.newCachedThreadPool();    
        int timeout =  60 * 30;
        final String browserName = browser;
        Callable<Boolean> task = new Callable<Boolean>(){

			@Override
			public Boolean call() throws Exception {
				if(browserName.equalsIgnoreCase("chrome")){
					runChromeTest(url);
					return Boolean.TRUE;  
				}else if(browserName.equalsIgnoreCase("firefox")){
					runTest(url);
					return Boolean.TRUE;
				}else
				{
					runIETest(url);
					return Boolean.TRUE;	
				}
			}
	    };
	    Calendar start = Calendar.getInstance();
	    start.setTime(new Date());
        Future<Boolean> future = exec.submit(task);    
        Boolean taskResult = null;    
        String failReason = null;    
        try {    
            taskResult = future.get(timeout, TimeUnit.SECONDS);    
        } catch (InterruptedException e) {    
            failReason = "Main thread was interrupted when waiting for computing result";    
        } catch (ExecutionException e) {    
            failReason = "Main thread is wating for result, but excpetion throw.";  
            e.printStackTrace();
        } catch (TimeoutException e) {    
            failReason = "Main thread is wating for result, but time out.";    
            exec.shutdownNow();    
        }   
        System.out.println(taskResult+";"+failReason);
        Calendar end = Calendar.getInstance();
	    end.setTime(new Date());
	    long duration = (end.getTimeInMillis()-start.getTimeInMillis())/1000/60;
	    System.out.println("duration is "+duration);
        if(duration<interval){
        	System.out.println("Wating ..."+ String.valueOf(interval-duration)+" minutes");
        	Thread.sleep(1000*(interval-duration)*60);
        }
	}	
	
	public static boolean deleteDirectory(File path) {
		if (path.exists()) {
			File[] files = path.listFiles();
			if(files==null)return true;
			
			for (int i = 0; i < files.length; i++) {
				if(files[i].lastModified()> Calendar.getInstance().getTimeInMillis()-1000*60*60)
					continue;
				if (files[i].isDirectory()) {
					
					deleteDirectory(files[i]);
				} else {
					files[i].delete();
				}
			}
		}
		return path.delete();
	}
}
 
with MAUI dependency,(eBay开发的自动测试框架,读者可以用WebDriver开发) Run as JAVA application with VM parameter: -Xmx1024M
  1. Set the thread count and hub url and FirefoxProfile path as you need.
  2. Need to pay attention to folder C:\Users\stack\AppData\Local\Temp, it might increase very fast, clean it before testing on node machine.
    Add task to clean up the temp folder.
    cleanup.ps1

    Set-StrictMode -Version Latest
    # Function to remove all empty directories under the given path. If -DeletePathIfEmpty is provided the given Path directory will also be deleted if it is empty.
    function Remove-EmptyDirectories([parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string] $Path, [switch] $DeletePathIfEmpty)
    {
        Get-ChildItem -Path $Path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
        # If we should delete the given path when it is empty, and it is a directory, and it is empty, then delete it.
        if ($DeletePathIfEmpty -and (Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -Force) -eq $null) { Remove-Item -Path $Path -Force }
    }
    # Function to remove all files in the given Path that were created before the given date, as well as any empty directories that may be left behind.
    function Remove-FilesCreatedBeforeDate([parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory=$true)][DateTime] $DateTime, [switch] $DeletePathIfEmpty)
    {
        Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $DateTime } | Remove-Item -Force
        Remove-EmptyDirectories -Path $Path -DeletePathIfEmpty:$DeletePathIfEmpty
    }
    # Function to remove all files in the given Path that have not been modified after the given date, as well as any empty directories that may be left behind.
    function Remove-FilesNotModifiedAfterDate([parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory=$true)][DateTime] $DateTime, [switch] $DeletePathIfEmpty)
    {
        Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $DateTime } | Remove-Item -Force
        Remove-EmptyDirectories -Path $Path -DeletePathIfEmpty:$DeletePathIfEmpty
    }
    # Delete all files that have not been updated in 1 hour.
    Remove-FilesNotModifiedAfterDate -Path "C:\Users\stack\AppData\Local\Temp" -DateTime ((Get-Date).AddHours(-1))

    cleanup.bat

    cd c:\grid
    powershell .\cleanup.ps1

    Add windows task CleanUpTempFolder:



  3. Because stress testing brought a big burden to node machine, so it might occupied too much CPU & Memory in node machine, make node machine can't create driver successfully.
    So change the c:\grid\service\watchdog\watchdog.config file, change run_time to 5, default is 15. And delete watchdog.log file.

    process_list=chrome.exe,iexplore.exe,firefox.exe,chromedriver.exe,IEDriverServer.exe
    run_time=3
    poll_time=1
  4. Monitoring tool:
    1. jvisualvm

    2. netstat -na (check connection situation)
  5. Problems we might found:
    org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launching Internet Explorer. Could not get document from window handle

    chrome crash
    Solution: kill all related processes, clean the temp folder, restart selenium node service

 

分享到:
评论

相关推荐

    Selenium2 Java自动化测试实战

    - **性能测试**:结合LoadRunner、JMeter等工具进行负载和压力测试。 - **移动应用测试**:使用Appium等工具进行移动应用的自动化测试。 #### 十一、总结与展望 - **总结**:回顾Selenium2 Java自动化测试的核心...

    EXT测试小样例--EXT测试小样例

    EXT测试小样例的创建通常涉及编写测试用例、搭建测试环境、运行测试并记录结果。开发者会使用像Selenium这样的自动化测试工具,编写脚本模拟用户操作,同时结合Jenkins等持续集成工具进行自动化测试和报告生成。 ...

    测试者

    在IT行业中,测试者扮演着至关重要的角色...总结来说,"测试者"项目可能涵盖HTML编码规范、前端框架的使用、服务器端测试环境的搭建与验证等多个方面,测试者需要具备全面的技能和严谨的态度,以确保产品的高质量交付。

    (179979052)基于MATLAB车牌识别系统【带界面GUI】.zip

    基于MATLAB车牌识别系统【带界面GUI】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题 下面我将对程序进行详

    DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题。下面我将对程序进行详细分析。 首先,程序开始时加载了一些数据文件,包括gfjl、fljl、fhjl1、cjgs和fhbl。这些文件可能包含了电力系统的各种参数和数据。 接下来是一些参数的设置,包括三种蓄电池的参数矩阵、迭代次数、种群大小、速度更新参数、惯性权重、储能动作策略和限制条件等。 然后,程序进行了一些初始化操作,包括初始化种群、速度和适应度等。 接下来是主要的迭代过程。程序使用粒子群算法的思想,通过更新粒子的位置和速度来寻找最优解。在每次迭代中,程序计算了每个粒子的适应度,并更新个体最佳位置和全局最佳位置。 在每次迭代中,程序还进行了一些额外的计算,如潮流计算、储能约束等。这些计算可能涉及到电力系统的潮流计算、功率平衡等知识点。 最后,程序输出了一些结果,包括最佳位置和适应度等。同时,程序还绘制了一些图形,如电压和损耗的变化等。 综上所述,这段程序主要是一个改进的粒子群算法,用于解决电力

    三保一评关系与区别分析

    三保一评关系与区别分析

    Day-05 Vue22222222222

    Day-05 Vue22222222222

    多功能知识付费源码下载实现流量互导多渠道变现+搭建教程

    多功能知识付费源码下载实现流量互导多渠道变现+搭建教程。资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力 方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线下载等多种功能,更多功能 正在不断更新中... 支持流量主变现模式,付费下载付费古观看等变现模式。 实现流量互导,多渠道变现。可以独立部署,并绑定自有独立域名,没有域名限制。

    住家保姆的工作职责、照顾老人住家保姆服务内容.docx

    住家保姆的工作职责、照顾老人住家保姆服务内容.docx

    《高温中暑事件卫生》一级(红色),二级(橙色),三级(黄色),四级(蓝色).docx

    《高温中暑事件卫生》一级(红色),二级(橙色),三级(黄色),四级(蓝色).docx

    职业中专技工学校专业评估表.docx

    职业中专技工学校专业评估表.docx

    统计计算使用R一书的源代码Rcode.zip

    统计计算使用R一书的源代码Rcode.zip

    YOLO算法-火灾和人员探测数据集-850张图像带标签-人-烟-火.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    社区居民诊疗健康-JAVA-基于SpringBoot的社区居民诊疗健康管理系统设计与实现(毕业论文)

    社区居民诊疗健康功能描述 社区居民诊疗健康系统是一个为社区居民提供健康管理、疾病预防、诊疗服务和健康教育的综合平台。该平台致力于提升居民的健康水平,通过智能化、便捷化的服务为居民提供高效的健康保障。以下是该系统的主要功能描述: 1. 用户注册与登录 居民注册:居民可以通过身份证、手机号或社交媒体账号进行注册,填写个人基本信息(如姓名、性别、年龄、联系方式等)并创建账户。 健康档案管理:每个居民注册后,系统会自动生成个性化健康档案,记录个人的健康历史、疾病记录、体检报告等。 2. 健康档案与记录管理 个人健康档案:包括居民的基础健康信息、既往病史、用药记录、免疫接种记录、体检报告等。 诊疗记录管理:记录每次诊疗信息,如诊断、治疗方案、用药情况及随访记录。 健康指标监测:定期记录和更新如血压、血糖、体重、体脂等常见健康指标,便于长期追踪和分析。 3. 在线问诊与诊疗服务 在线咨询:居民可以通过平台预约或直接向社区医生发起在线问诊,获取健康咨询、疾病预防建议、用药指导等服务。 远程诊疗:提供视频问诊功能,方便居民与医生进行实时面对面的远程交流,获得更加详细的诊疗建议。 预约就诊:居民可以

    面部、耳廓损伤损伤程度分级表.docx

    面部、耳廓损伤损伤程度分级表.docx

    java毕设项目之ssm校园美食交流系统+vue(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    功能完善的小说CMS系统项目全套技术资料.zip

    功能完善的小说CMS系统项目全套技术资料.zip

    YOLO算法-回收站数据集-501张图像带标签-黑色垃圾箱-绿色垃圾桶-箱子-杯子-老鼠-蓝色垃圾桶.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    java毕设项目之ssm助学贷款+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    (3127654)超级玛丽游戏源码下载

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

Global site tag (gtag.js) - Google Analytics