RFT Best Practices - 2. 窗体处理

    窗体是程序的基础。无论是主窗体,还是弹出窗体,他们往往都是需要首先定位的对象。窗体,作为一类特殊对象,他们都是根对象的直接子对象,针对这一特点,对他们定位就非常简单了。通常,通过窗体标题,就能很好的找到所需的窗体。具体方法如下。

private double waitCheckInterval = ((Double) getOption(IOptionName.WAIT_FOR_EXISTENCE_DELAY_BETWEEN_RETRIES))   
        .doubleValue();    
private double waitMaxTime = ((Double) getOption(IOptionName.MAXIMUM_WAIT_FOR_EXISTENCE))   
        .doubleValue();    
private TestObject rootTO = null;   
public boolean getRootWithCaption(String captionExpr) {   
    double timeNow = System.currentTimeMillis() / 1000;   
    double endTime = timeNow + waitMaxTime;   
    rootTO = null;   
    while (rootTO == null && timeNow < endTime) {   
        RootTestObject root = RootTestObject.getRootTestObject();   
        TestObject[] ftWinObjects = null;   
        RegularExpression exp = new RegularExpression(captionExpr, false);   
        ArrayList<Property> v = new ArrayList<Property>();   
        v.add(new Property(".captionText", exp));   
        v.add(new Property(".domain", "Java"));   
        v.add(new Property("showing", "true"));   
        ftWinObjects = root.find(atChild((Property[]) v.toArray(new Property[0])));   
        if (ftWinObjects != null) {   
            if (ftWinObjects.length > 1) {   
                throw new AmbiguousRecognitionException("Find more windows with capture: " + captionExpr);   
            }   
            if (ftWinObjects.length == 1) {   
                rootTO = ftWinObjects[0];   
                return true;   
            }   
        } else {   
            sleep(waitCheckInterval);   
            timeNow = System.currentTimeMillis() / 1000;   
        }   
    }   
    return false;   
}  

 

 

 

 

 

    上面的方法首先取得对象查找的间隔时间、最大等待时间,并声明了空的窗体对象。接下来进入方法,根据查找结果和最大等待时间来循环查找窗体。先获得根测试对象,然后查找其直接子对象,查找条件为:窗体标题符合正则表达式captionExpr的定义,属于Java域,并且当前为显示状态。最后处理查找结果,如果结果大于1个,则抛出异常;如果结果等于1,则返回true;如果结果为空,则等待并重新计算时间,并继续循环查找;如果最后仍未空并退出循环,则返回false

    有的时候,窗口的出现并不是一定的,例如很多弹出窗口。这时候,对象查找并不需要循环等待,相应的方法应为:

public boolean getRootWithCaptionWithoutWait(String captionExpr) {   
    rootTO = null;   
    sleep(waitCheckInterval);   
    RootTestObject root = RootTestObject.getRootTestObject();   
    TestObject[] ftWinObjects = null;   
    RegularExpression exp = new RegularExpression(captionExpr + "$", false);   
    ArrayList<Property> v = new ArrayList<Property>();   
    v.add(new Property(".captionText", exp));   
    v.add(new Property(".domain", "Java"));   
    v.add(new Property("showing", "true"));   
    ftWinObjects = root.find(atChild((Property[]) v.toArray(new Property[0])));   
    if (ftWinObjects != null) {   
        if (ftWinObjects.length > 1) {   
            throw new AmbiguousRecognitionException("Find more windows with capture: " + captionExpr);   
        }   
        if (ftWinObjects.length == 1) {   
            rootTO = ftWinObjects[0];   
            return true;   
        }   
    }   
    return false;   
} 

 

    这样一来,就可以用统一的方法来进行窗体的查找。具体代码如下:

 

 

 

protected boolean ExistWin(String winName, boolean wait) {   
    release();   
    if (wait)   
        return og.getRootWithCaption(winName);   
    else  
        return og.getRootWithCaptionWithoutWait(winName);   
}   
  
public boolean isDialog(String caption, boolean wait) {   
    return super.ExistWin(caption, wait);   
}  

    前一个方法利用传入的窗体标题正则表达式,和窗体查找逻辑,进行窗体查找。后一个方法对其进行调用,返回是否查找成功的结果。事实上,这两个方法完全可以写成一个,但是在设计框架时,应考虑到自动化操作的各个环节,应把每一个环节独立开来,才能具有最大的灵活性。根据我的经验,对对象的查找和查找后的操作应独立成两个不同类来完成,其中对对象的查找应为一个RFTsuper class。其实也就是继承了RationalTestScript类的抽象类,对对象的操作应为一个Script,这个Scriptsuper class应为自己之前定义的对象查找类,而不是默认的RationalTestScript。这一部分后面还会讲到。

    当需要关闭可能出现的错误窗口时,可以这样使用:

if (aDialog.isDialog(".*Error", false)) {    
    aDialog.close();    
} 

     当需要操作一定出现的窗口时,可以这样使用:

if (aDialog.isDialog("Warning", true)) {   
    aDialog.clickButton("Yes");   
} 

    至此,所有针对窗体的处理逻辑就基本完整了。当然,还有一些其它情况,例如可能有些被测程序允许同时打开多个实例,这就需要支持同时获取并操作多个具有相同标题的窗体。这样的情况大家可以一同探讨如何处理。

 

 

同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值