记录的行是 list_prmT_SV_N18947080x18A5068()。点击(atText(" Claimed Students"));
我试图让它成功的是:
ClickDropdown("Claimed Students");
public static void ClickDropdown(String name)
{
GuiTestObject textObj = findTextObject(name);
if (textObj != null) {
textObj.click();
} else {
throw new ObjectNotFoundException();
}
}
private static GuiTestObject findTextObject(String name)
{
TestObject[] tobs = find(atDescendant(".class", "Html.SELECT", ".value", name ), true);
if(tobs.length == 0)
return null;
return (GuiTestObject)tobs[0];
}
可用的属性是.id(动态),。text,.class
答案 0 :(得分:1)
您在问题中描述的问题是一个常见问题,主要与使用JQuery构建的HTML应用程序有关。
使用find
方法是正确的方法,因为您可以抽象出RFT使用的识别属性。查看您的findTextObject
我建议您修改find
调用,如下所示:
find(atDescendant(".class", "Html.SELECT"), false);
使用false
参数,您可以让RFT在所有页面元素中进行搜索,而不仅仅是您之前录制的页面元素。
如果页面中只有一个Html.SELECT
,则可以直接使用select(String value)
类型的方法SelectGuiSubitemTestObject
。否则,首先必须遍历先前找到的对象并搜索包含要选择的文本的对象。然后,您的代码将变为:
public static void clickDropdown(String name) {
// Prepare finding properties
Property[] props = new Property[2];
props[0] = new Property(".class", "Html.SELECT");
props[1] = new Property(".text", new RegularExpression(".*" + name + ".*", false));
// Find al select items inside the current page
TestObject slcs = find(atDescendant(props), false);
// Interact with the element
if (slcs.length > 0)
((SelectGuiSubitemTestObject) slcs[0]).select(name);
}
在这种情况下,您无法直接在.text
方法中使用find
,因为select的.text
属性的值等于其所有值的串联。因此,您必须使用RegularExpression
。
警告:当且仅当您搜索的对象在搜索操作时已在页面中完全加载时,find
方法才有效。
使用动态查找技术可能比使用RFT直接记录的元素慢。不幸的是,如果您的UI具有动态元素' ids,这是与他们互动的唯一方式。
在this blog中,有一些提示可以提高动态查找方法的性能。
1)对象选择:在这里,您需要找到要搜索的正确对象集。让我们将所选对象称为地标,这是我们在现实世界中从一个地方移动到另一个地方时使用的。
2)搜索类型:要做出的第二个重要决定是如何搜索所选对象。
3)属性选择:我们已经找到了我们想要搜索的对象,我们还想出了对象子层次结构内的搜索范围,现在是时候决定了我们希望将哪些参数传递给我们的搜索类型。
4)内存清理:使用find返回的对象时要记住的最后但同样重要的事情是,一旦完成工作或者只要您觉得对象可能已更改,就会释放对象在AUT中作为一些中间交易的一部分。
我正在开发一个基于RFT的小框架,让您在没有任何录制操作的情况下编写脚本。如果您有兴趣,请告诉我。
希望这会对你有所帮助:)。