首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IBM:在窗口中查找_really_可见对象

IBM:在窗口中查找_really_可见对象
EN

Stack Overflow用户
提问于 2014-07-18 14:03:53
回答 3查看 2.9K关注 0票数 1

我对IBM(8.5版)有个问题。我正在为一个相对复杂的应用程序建立一个自动化测试框架,它使用了大量的选项卡和面板。问题是,我无法检查使用 find 方法找到的对象现在是否在屏幕上实际可见(在所有其他对象的前面/顶部)。换句话说,我需要一个算法,它将只搜索当前活动(带到前面)选项卡。

我使用Delphi完成了一个非常简单的应用程序来调试这个问题:一个TPageControl包含2个选项卡,每个选项卡上都有一个文本字段(TEdit)。主窗口是一个映射的对象,所以我是这样进行搜索的:

代码语言:javascript
运行
复制
TestObject[] objs = window().find(atDescendant(".class", "TEdit"));

如果应用程序刚刚启动(只有第一个文本字段是可见的-第一个选项卡是活动的),那么find方法将返回一个只有一个文本字段的数组。但是,如果我激活第二个选项卡,那么RFT就会找到两个文本字段(无论我在后面做什么),并且没有办法区分其中的哪个实际上在屏幕上。

我一直在使用一些自动化工具,但是RFT中的这个东西让我很沮丧。以下是一些更多的信息,以避免明显的建议。相信我,我一直在寻找答案。

  1. 当我在制表符之间切换时,字段的属性(在对象检查器中可用)都不会改变。标准属性(如.enabled.visible )总是正确的。这是正确的,因为它们只是控件的属性,而不是一些实时的东西。
  2. RFT对象的方法isShowing()总是为两个字段返回true
  3. RFT对象的方法ensureObjectIsVisible()总是为两个字段返回,并且从不切换选项卡将所需字段带入视图。
  4. 我可以调用click() for ()或任何不可见字段的用户模拟操作,测试将继续运行,没有任何例外。更多的--如果窗口在这样的点击时没有聚焦,它确实得到了焦点--看起来RFT只是将一次点击发送到不可见对象的矩形中心的窗口。
  5. 方法getClippedScreenRectangle()getScreenRectangle()getVisibleArea()为不可见文本字段返回相同的矩形(测试期间窗口完全位于屏幕边框内)。
  6. 当我使用getImage()生成不可见文本字段的屏幕快照时,结果是将窗口图像的一部分保存在不可见元素的屏幕矩形中。
  7. 如果我为这两个文本字段创建映射对象,唯一的区别是,在刚刚启动的应用程序测试运行的情况下,每次调用不可见甚至尚未激活的文本字段时,它都会挂起几秒钟(例如,如果您在应用程序启动后调用text2().exists(),而激活选项卡是第一个,它将挂起并最终返回true)。
  8. 在我的调试Delphi构建的应用程序和用Java编写的实际SUT上,这种不正确的行为和不能区分活动控件和非活动控件的行为是一样的。

在我的调试应用程序中,我可以检查父对象以了解哪个文本字段属于哪个选项卡,但是如何找到哪个选项卡被激活?

QTP和TestComplete都具有确保所需对象实际上在屏幕上的功能,如果尝试单击超出视图的对象,两者都会抛出异常。更进一步- QTP允许访问对象的本机属性和方法,这通常在没有任何正确的方法时会有所帮助(我可能会在调试应用程序中检查ActivePageIndex,以了解哪个选项卡是活动的)。

我出什么问题了吗?还是我读的东西不够仔细?或者这个问题对我的机器来说是局部的?

如何使用IBM检查实际对象的可见性?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-24 13:14:11

最终我找到了解决办法。由于某些原因,使用您实际看到的操作的唯一方法是getChildAtPoint().我见过一种使用这种方法的解决方案,但它是关于HTML自动化的,在我的例子中没有起作用。

此方法在指定的点上查找第一个直接子节点。我的想法是从下到上遍历父对象树,并检查每次getChildAtPoint()返回上一个元素的屏幕点的前一个元素。当容器实际上不可见时,返回的结果是。前两种方法可能并不是必要的,但由于自动化框架通常是一种神奇的黑匣子(而且RFT无疑是其中一个突出的例子),让它成为一种保险。

代码语言:javascript
运行
复制
public boolean isReallySameId(GuiTestObject obj1, GuiTestObject obj2)
{
    Object id1 = obj1.getProperty(".associatedId");
    Object id2 = obj2.getProperty(".associatedId");
    // I don't know if this property always exists
    if ((id1 == null) || (id2 == null)) return false;
    return (id1.equals(id2));
}

public boolean isReallyInScreen(GuiTestObject obj)
{
    Rectangle screen = RootTestObject.getRootTestObject().getScreen().getScreenRectangle();
    Rectangle intersection = screen.intersection(obj.getScreenRectangle());
    return ((intersection.width > 0) && (intersection.height > 0));
}

public boolean isReallyVisible(GuiTestObject obj)
{
    if (!isReallyInScreen(obj)) return false; // basic check
    GuiTestObject parent = (GuiTestObject) obj.getMappableParent();
    if (parent == null) return true; // top object in screen
    GuiTestObject found;
    while (parent != null)
    {
        found = (GuiTestObject) parent.getChildAtPoint(obj.getScreenPoint());
        if ((found == null) || (!isReallySameId(found, obj))) return false;
        obj = parent;
        parent = (GuiTestObject) obj.getMappableParent();
    }
    return true;
}

啊,多好的挑战啊。谢谢,RFT!:)

我不确定这个解决方案是否适用于所有类型的测试对象。我特别不确定它对不可映射的对象是否有效。这是我在特定情况下需要的解决方案,所以如果您遇到了同样的问题,您可能需要定制它。

票数 3
EN

Stack Overflow用户

发布于 2014-07-19 17:41:07

若要确定对象是否可见,请尝试类似的操作,并查看是否解决了问题。

代码语言:javascript
运行
复制
boolean  isActuallyVisible(TestObject t)
    {
        boolean isVisible = true;
        Rectangle r = (Rectangle) t.getProperty(".bounds");
        if(r.width == 0 && r.height ==0)
        {
            isVisible = false; // bound says height /width is zero , most likely  invisible object.
        }

        return isVisible;
    }
票数 0
EN

Stack Overflow用户

发布于 2014-07-21 14:08:30

我认为最好/唯一的方法是找到一些可区分的属性--无论是文本字段还是父母选项卡。您可以尝试插入属性验证点,以查看比对象检查器中更多的属性。或者使用getProperties()并打印所有可用属性:

代码语言:javascript
运行
复制
Hashtable props = someElement().getProperties();
Set entries = props.entrySet();
for (Object entry : entries)
    System.out.println(entry);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24826933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档