RFT Html.Select具有动态ID,无法识别

时间:2015-03-18 16:56:45

标签: regex rft

记录的行是 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

1 个答案:

答案 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的小框架,让您在没有任何录制操作的情况下编写脚本。如果您有兴趣,请告诉我。

希望这会对你有所帮助:)。