自动化脚本运行初始化失败失败,怎么处理

自动化测试脚本冻结问题分析与解决方案
免费下载:
下载更多的 ,并加入 ,参与在线交流。概述在用 Rational Functional Tester(RFT)进行自动化测试的过程中,偶尔会发生脚本停止响应的情况:即运行一个自动化测试项目很长时间后想要查看测试结果,却发现由于某个脚本的冻结,测试并没有完成,测试程序卡在某一点,不执行也不报错,使得后面的脚本都没有被运行。出现这种情况的原因可能是 AUT(Application Under Test)出现死锁,浏览器页面停止响应,也可能是 RFT 和 AUT 的兼容性问题,情况复杂,很难避免。脚本冻结发生后,只有先通过进程关闭 AUT,本脚本会报错并 Failed,后面的脚本才会继续运行。这种情况的出现严重影响了测试的效率,给测试人员带来很大的困扰。本文通过 java 类 FutureTask 完美解决了上述问题。在本文中,作者将结合自己在测试中遇到的实际案例,简要介绍 FutureTask 的内容,在解决这个问题上的优势,以及具体如何运用 FutureTask 来解决脚本冻结问题。脚本冻结问题本节以 IE 浏览器冻结为例描述脚本冻结的现象:某个自动化测试脚本的测试对象是嵌入到 Office 软件中的内容管理插件,具体执行过程是先通过 IE 浏览器连接到服务器,修改服务器端的相关配置,然后再打开内容管理软件,对相关功能进行测试。冻结问题出现在通过 IE 设置参数阶段,具体表现是:不再继续执行脚本,也不抛出异常,RFT 用来显示当前操作的 Playback 窗口也不再显示正常执行时的 find 或 sleep 动作,而是显示空白(如图 1 红框中所示),此时的 IE 浏览器已无法通过窗口上的关闭按钮关闭,而只能直接通过进程将其关闭,整个脚本的运行呈现"冻结"的状态,中止执行,后面的脚本也无法运行。图 1.Playback 界面解决思路解决这个问题的思路是设置超时,即设置一个时长,如果某一段代码在这个时长内未运行完成,则判断该段代码出现冻结现象。之后做以下处理:关闭 AUT 的进程,并重新运行这段代码。重复上述处理直到该段代码顺利执行完毕。这里之所以要重新运行出现冻结的代码,目的是可以让冻结的脚本重新进行测试,而不是直接 Failed 后执行下一个脚本,如此可以提高测试的准确率和效率。由于出现冻结时主线程已卡死,所以要解决这个问题必须开辟子线程,而子线程的作用有两种选择:一是执行计时的程序;二是执行易卡死的代码。选择第一种作用的执行模式很简单,即子线程发现超时后关闭 AUT 进程,使得后面的脚本得以继续执行,但这种方式无法实现前面所说的重新执行冻结脚本设想;第二种方式可以通过循环的方式实现重新执行冻结脚本的设想,但是超时如何判断又成为问题。本文采用了第二种方式,并通过 java 类 FutureTask 完美解决了上述问题。下面就简单介绍一下 FutureTask 的内容,以及它在解决这个问题上的独特优势FutureTask 简介及优势FutureTask 类是 Future 接口的一个实现,Future 接口提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。主要包含以下五个方法:boolean cancel(boolean mayInterruptIfRunning):该方法用于取消对任务的执行,如任务已完成或无法取消则返回 false,如果任务正在执行中则通过参数 mayInterr-uptIfRunning 判断是否中断任务执行的线程。boolean isCancelled():如果在任务完成前成功调用 cancel 方法,则返回 true。boolean isDone():如果任务完成则返回 true,不管是正常完成还会由于异常或被取消而完成get():阻塞主线程,直到该子线程计算完成,并获取结果get(long timeout,TimeUnit unit):这是解决冻结问题的核心方法,即等待参数所定的时间后获取结果,如果此时线程还未执行完成,则抛出 TimeoutException。FutureTask 也实现了 Runnable 接口,所以可以通过线程池来执行,也可以开辟子线程来执行其中的任务。介绍到这里,FutureTask 用来解决冻结问题的优势已经很明显了:其一,它可以方便的开辟子线程;其二,可以通过它的 get(long timeout,TimeUnit unit) 方法来设置超时。我们需要做的就是将会出现冻结现象的代码作为 FutureTask 的任务,将其交给子线程来执行,然后在主线程中调用 get(long timeout,TimeUnit unit) 方法,并合理设置时长参数。当脚本冻结时,子线程无法在指定时间内完成 FutureTask 的任务,get 方法就会抛出 TimeoutException,主线程捕获这个异常后重新通过 FutureTask 运行出现冻结现象的代码。将此过程放在循环中重复执行,直到 FutureTask 的任务正常完成。因为脚本冻结出现的概率不高,所以一般重复运行两到三次就可以正确执行。具体解决方案构造 FutureTask 需要一个实现了 callable 接口的类,该类的 call() 方法中的内容就是 FutureTask 需要完成的任务。作者在实例中直接使用了匿名内部类,具体代码如下:清单 1. Call 方法FutureTask&String& future =
new FutureTask&String&(new Callable&String&()
public String call() {
ecmui.factory.Application.login(commonXML.getWPURL(),
commonXML.getAE_Admin(),commonXML.getCommonUserPW());
SitePreferences sp = new SitePreferences();
sp.general().setFileTrackingEnable("Yes");
sp.appbcs().setDefaultETShowing("Yes");
return "";
}});其中 call() 方法中的代码就是通过 IE 浏览器设置参数的代码,这里可以替换成任意出现冻结现象的代码。然后是创建线程池,通过子线程执行 FutureTask,代码如下:清单 2. 子线程执行 FutureTasktry
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(future);
String result=future.get(, TimeUnit.MILLISECONDS);
}catch(TimeoutException e)
future.cancel(true);
System.out.println(e.toString()+":start workplaceXT again");
Application.killAppProcess("IEXPLORE");
sleep(10);
}ExecutorService 用来创建线程池执行 FutureTask。在上面代码中尤其要注意 get 方法的时长设置要合理。在本例中,作者分析了多次未冻结情况下设置参数所需要的时间,发现每次都不超过两分钟,所以为了准确起见,将时长设为三分钟,即如果三分钟内设置参数的代码还未运行完毕,则判断脚本冻结,get 方法抛出 TimeoutException。catch 语句用来捕获 TimeoutException,如果捕获,则依次执行取消任务、输出错误信息、通过进程关闭 IE 浏览器的操作。将上述代码放在循环中就可实现:“运行冻结代码——冻结——关闭冻结程序”,这一过程循环往复,直到成功执行可能出现冻结的代码。完整代码如下:清单 3. 完整代码调用while(true)
FutureTask&String& future = new FutureTask&String&(new Callable&String&()
public String call() {
ecmui.factory.Application.login(commonXML.getWPURL(),
commonXML.getAE_Admin(),
commonXML.getCommonUserPW());
SitePreferences sp = new SitePreferences();
sp.general().setFileTrackingEnable("Yes");
sp.appbcs().setDefaultETShowing("Yes");
return "";
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(future);
String result=future.get(, TimeUnit.MILLISECONDS);
}catch(TimeoutException e)
future.cancel(true);
Application.killAppProcess("IEXPLORE");
sleep(10);
}在上述代码中,如果 get 方法抛出超时异常,则是脚本出现冻结,代码直接跳到 catch 语句执行,并不跳出循环;而如果不抛异常,说明参数设置正常且没有出现冻结现象,则顺序执行到 break 语句,跳出循环。总结文中所述的解决脚本冻结问题的方法有很强的通用性,读者可以将其灵活运用到自己的测试工作中来解决其他类型的脚本冻结问题,提高自动化脚本的测试效率。
相关主题访问 ,获得关于 IBM Rational 软件交付平台(Rational Software Delivery Platform)产品的技术资源和最佳实践。订阅 ,一份关于 developerWorks 指南、文章、下载、社区活动、网络广播和技术讲座的电子周刊。下载免费的 。访问 ,了解最新的 IBM Rational Functional Tester (RFT) 产品文档和产品信息,获得关于软件自动化测试的技术文档和参考资源,可以查阅产品概览、产品手册、产品技术支持、试用版下载,以及相关文章、教程、多媒体课堂和产品演示等信息。获取免费的 ,了解最新的 IBM Rational 软件开发工具技术文档和资源。下载更多免费的 ,了解 IBM Rational 软件的最新特性。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=RationalArticleID=838315ArticleTitle=自动化测试脚本冻结问题分析与解决方案publish-date=自动化脚本多线程运行
列表解析: 可以引用操作符[]编写小的循环和判断。比for循环和其它迭代方法效率更高。
&&&&&&& eg: print([x for x in range(10)])
getopt模块:专门用来处理命令行参数
多线程脚本的入口:执行命令python sub_script.py& -j 4 -m
sub_script.py
# -*- coding:utf-8 -*-
import os,sys
from subprocess import Popen, PIPE, STDOUT
import getopt
from multiprocessing.pool import ThreadPool as Pool
def run_cmd(cmd):
& & print(cmd)
& & p = Popen(cmd)
& & #(stdout,stderr)= p.communicate()
& & retval = p.wait()
&& return [True& if not retval else return False]
def call_mult_process():
& & print(&call_mult_process ...&)
& & if get_max_mem and os.name == 'posix':
& & & & cmd = [&/usr/bin/time&, &-v&, &ping 127.0.0.1 -n 10&]
& & & & cmd = [&ping 127.0.0.1 -n 10&]
& & pool = Pool(processes = pjobs)
& & raw_results = [pool.apply_async(run_cmd,(cmd)) for i in range(10)]
& & #results = [r.get() for r in raw_results]
& & pool.close()
& & pool.join()
#self test
if __name__ == '__main__':
& & pjobs = 2
& & get_max_mem = None
& & & & opts,argv = getopt.getopt(sys.argv[1:],&j:m&)
& & except getopt.GetoptError as err:
& & & & print(err)
& & & & sys.exit(0)
& & for o,a in opts: #opts is dics
& & & & if o == &-j&:
& & & & & & pjobs = int(a)
& & & & elif o == &-m&:
& & & & & & get_max_mem = 1
& & argv.insert(0,sys.argv[0])
& & sys.argv = argv
& & call_mult_process()
本文已收录于以下专栏:
相关文章推荐
1、selenium中如何判断元素是否存在?
- isElementPresent
2、selenium中hidden或者是display = none的元素是否可以定位到?
# -*- coding:utf-8 -*-
import os,sys
from subprocess import Popen, PIPE, STDOUT
import getopt
Java工程师的最佳学习路线!
JAVA老司机直播啦:通过对架构模式和学习主线的高度总结,可让你快速掌握Java学习的最佳路线,从而达到事半功倍的效果!戳我立即掌握!
#coding=utf-8
from selenium import webdriver
import threading
import csv
import time
from selenium.w...
最后一章我们说下多线程,在前面我们已经说完如何分布式执行脚本,那在里面引入多线程并发执行case,也十分简单。
第一,我们创建一个线程类,构造器中传入要执行的脚本和要输出目录。在run方法体内让执行这...
1、selenium中如何判断元素是否存在?
- isElementPresent
2、selenium中hidden或者是display = none的元素是否可以定位到?
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)11:22 提问
WebDriver启动失败后如何处理
使用Selenium2.0开发Web自动化测试脚本时,使用IEDriver或者ChromeDriver,
因为各种意外的情况导致启动WebDriver时抛出异常,
程序本身无法得到WebDriver的句柄,但是查看后台进程发现WebDriver已经启动。
想了解下如果服务器上同时有多个driver在运行的情况下,如何找到本次启动的driver并且关闭。
手工关闭就不用讲了,因为是自动化并行验证的场景。
按时间排序
每次启动一个webdriver就保存进程id,这样出错后就知道新增的这个ID是对应的,结束它就可以了
在服务器上会同时拉起多个测试进程,每个进程只启动一个webdrvier,你让我们怎么记录进程号呢?
如果多个webdriver同时启动,
所以你的方案还需要考虑
在服务器上会同时拉起多个测试进程,每个进程只启动一个webdrvier,你让我们怎么记录进程号呢?
如果多个webdriver同时启动,
所以你的方案还需要考虑
其他相关推荐
其他相似问题16:36 提问
在python+selenium自动化脚本中,自动化测试代码不运行完也不报错
from selenium import webdriver
from time import sleep
from mon.keys import Keys
from mon.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get(')
driver.maximize_window()
driver.implicitly_wait(30)
driver.find_element_by_id('j_username').send_keys('user')
driver.find_element_by_id('j_password').send_keys('111111')
driver.find_element_by_xpath('//*[@id="loginForm"]/div[4]/button').click()
driver.back()
message = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/h4').text
if 'welcome' in message:
print('登录成功,测试成功')
print('登录失败,测试失败')
driver.quit()
遇到chrome中的这个,注释掉就能运行了,不注释代码就一直停在那不运行也不报错,求大神指点一下。
if(zgtisLogin==""){
sessionStorage.setItem("islogin",true);
top.location.href="ChatTool://@&%=HongheServer.getInstance().getOperator().getName()%&@&%=HongheServer.getInstance().getOperator().getPassword()%&"
按赞数排序
建议学习一下pyswat框架
其他相关推荐
其他相似问题每日登录:+1西币&+1积分
&下次自动登录
绑定第三方账号登录 & & &
扫描二维码登录支持中心移动端
获取动态密码
售前文档售后文档热门视频系列热门版区售后服务概述自助服务帮助信息
You are here:
WINCC打开C动作脚本时,动...
热点活动:
置评已完成,谢谢!
您现在可以为该问题添加标签。
WINCC打开C动作脚本时,动不了。 - 已解决问题
准备用C脚本编辑WINCC画面中按钮的鼠标动作时,发现打不开脚本编辑器,而且编辑画面卡死,只能在进程中关闭编辑画面,不知哪位大神能帮忙解决?如能解决,高分悬赏。(个人认为是电脑系统出了问题,WINCC已经重装过,但没有解决问题)
产品版区:
悬赏西币:10 | 解决时间: 21:17:14 | 提问者:& - 学长&nbsp&nbsp第2级
问题ID:136878
1.你是打开原来的项目还是新建项目,建议新建项目。2.不要在进程中关闭,要在开始&运行&中输入&reset_wincc.vbs&回车操作然后再试3.如果不行建议安装系统要兼容
顶级工程师&nbsp&nbsp第12级&
以下网友赞了您的问题:
填写您的评论...
提问者对于答案的评价:虽然没解决问题,还是感谢
更多相关问题
本版精华问答
等待您来回答
作者/最新回复
最后回复时间
扫描打开手机版
支持中心新发布“关注”功能了!实时查看彼此动态,更方便地进行技术交流。
不管是“关注”与“被关注”,相信都是一个美好的开始!
还有多重奖励派送,快快行动起来吧!
20秒帮我们优化支持中心!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
欢迎您来到找答案
在“找答案”,已有超过7万个被解决的技术问题供您参考!
西门子技术专家亲自把关!常规的,简单的问题,在这里您都可以找到答案!
遇到了问题,就来“找答案”提问。
点击搜索框右侧的提问按钮,只需2步就能成功提交问题!分分钟就有无数大侠前来帮你。
在“找答案”每天都有大量的新问题。
别犹豫,只需要点击问题下方的“我要回答”就能参与。答题不光有积分相送,也会给您积攒大侠人气。
“找答案”定期开展各种有奖活动期待您的参与。
更有机会参加西门子高端用户峰会。领略西门子的博大精深!

我要回帖

更多关于 vba运行时自动化错误 的文章

 

随机推荐