我对IBM(8.5版)有个问题。我正在为一个相对复杂的应用程序建立一个自动化测试框架,它使用了大量的选项卡和面板。问题是,我无法检查使用 find 方法找到的对象现在是否在屏幕上实际可见(在所有其他对象的前面/顶部)。换句话说,我需要一个算法,它将只搜索当前活动(带到前面)选项卡。
我使用Delphi完成了一个非常简单的应用程序来调试这个问题:一个TPageControl包含2个选项卡,每个选项卡上都有一个文本字段(TEdit)。主窗口是一个映射的对象,所以我是这样进行搜索的:
TestObject[] objs = window().find(atDescendant(".class", "TEdit"));如果应用程序刚刚启动(只有第一个文本字段是可见的-第一个选项卡是活动的),那么find方法将返回一个只有一个文本字段的数组。但是,如果我激活第二个选项卡,那么RFT就会找到两个文本字段(无论我在后面做什么),并且没有办法区分其中的哪个实际上在屏幕上。
我一直在使用一些自动化工具,但是RFT中的这个东西让我很沮丧。以下是一些更多的信息,以避免明显的建议。相信我,我一直在寻找答案。
在我的调试应用程序中,我可以检查父对象以了解哪个文本字段属于哪个选项卡,但是如何找到哪个选项卡被激活?
QTP和TestComplete都具有确保所需对象实际上在屏幕上的功能,如果尝试单击超出视图的对象,两者都会抛出异常。更进一步- QTP允许访问对象的本机属性和方法,这通常在没有任何正确的方法时会有所帮助(我可能会在调试应用程序中检查ActivePageIndex,以了解哪个选项卡是活动的)。
我出什么问题了吗?还是我读的东西不够仔细?或者这个问题对我的机器来说是局部的?
如何使用IBM检查实际对象的可见性?
发布于 2014-07-24 13:14:11
最终我找到了解决办法。由于某些原因,使用您实际看到的操作的唯一方法是getChildAtPoint().我见过一种使用这种方法的解决方案,但它是关于HTML自动化的,在我的例子中没有起作用。
此方法在指定的点上查找第一个直接子节点。我的想法是从下到上遍历父对象树,并检查每次getChildAtPoint()返回上一个元素的屏幕点的前一个元素。当容器实际上不可见时,返回的结果是空。前两种方法可能并不是必要的,但由于自动化框架通常是一种神奇的黑匣子(而且RFT无疑是其中一个突出的例子),让它成为一种保险。
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!:)
我不确定这个解决方案是否适用于所有类型的测试对象。我特别不确定它对不可映射的对象是否有效。这是我在特定情况下需要的解决方案,所以如果您遇到了同样的问题,您可能需要定制它。
发布于 2014-07-19 17:41:07
若要确定对象是否可见,请尝试类似的操作,并查看是否解决了问题。
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;
}发布于 2014-07-21 14:08:30
我认为最好/唯一的方法是找到一些可区分的属性--无论是文本字段还是父母选项卡。您可以尝试插入属性验证点,以查看比对象检查器中更多的属性。或者使用getProperties()并打印所有可用属性:
Hashtable props = someElement().getProperties();
Set entries = props.entrySet();
for (Object entry : entries)
System.out.println(entry);https://stackoverflow.com/questions/24826933
复制相似问题