【问题标题】:RFT Html.Select has dynamic id and is not recognizedRFT Html.Select 具有动态 id 且无法识别
【发布时间】:2015-03-18 16:56:45
【问题描述】:

记录的行是 list_prmT_SV_N18947080x18A5068().click(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(dynamic)、.text、.class

【问题讨论】:

  • 抱歉,请问您有什么问题?

标签: regex rft


【解决方案1】:

您在问题中描述的问题是一个常见问题,主要与使用 JQuery 构建的 HTML 应用程序有关。

使用find 方法是正确的方法,因为您可以抽象RFT 使用的识别属性。查看您的findTextObject,我建议您将find 调用修改如下:

find(atDescendant(".class", "Html.SELECT"), false);

使用 false 参数,您可以允许 RFT 在所有页面元素中搜索,而不仅仅是在您之前记录的元素中。

如果页面中只有一个Html.SELECT,可以直接使用SelectGuiSubitemTestObject类型的方法select(String value)。否则,首先您必须遍历先前找到的对象并搜索包含您要选择的文本的对象。然后,您的代码将变为:

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);
}

在这种情况下,您不能在find 方法中直接使用.text,因为选择的.text 属性的值等于其所有值的串联。所以,你必须使用RegularExpression。

警告:find 方法当且仅当您正在搜索的对象在搜索操作时已完全加载到页面中时才有效。

使用 动态查找 技术可能比使用 RFT 直接记录的元素要慢。不幸的是,如果您的 UI 具有动态元素的 ID,这是与它们交互的唯一方法。

在this blog 中给出了一些提高动态查找方法性能的提示。

1) 对象选择:在这里您需要找到要搜索的正确对象集。让我们将选定的对象称为地标,这是我们在现实世界中必须从一个地方移动到另一个地方时使用的。

2) 搜索类型:要做出的第二个重要决定是您要如何搜索所选对象。

3) 属性选择 : 我们已经找到要搜索的对象,我们也已经确定了对象子层次结构中的搜索范围,现在是时候决定了我们喜欢将什么参数传递给我们的搜索类型。

4) 内存清理 :在使用 find 返回的对象时要记住的最后但同样重要的事情是在工作完成或感觉对象可能已更改时立即释放对象在 AUT 中作为某些中间事务的一部分。

我正在开发一个基于 RFT 的小型框架,让您无需任何录制操作即可编写脚本。如果您有兴趣,请告诉我。

希望对你有帮助:)

【讨论】:

  • 嗨,Riccardo.Thnx 一堆。请您给我代码的层次结构,因为我不知道您上面的行在我的脚本中的位置。
  • 另外,我对获取框架信息非常感兴趣。我可以通过 rvmankani@gmail.com 联系到我
  • 再次感谢。我使用了这段代码。我得到子项目未找到异常。在 SelectGuiSubitemTestObject 上调用 exception_context = select()(Ref:RemoteProxyReference{testContext:efb01050e89a0, objectId:12273, testObjectClass:SelectGuiSubitemTestObject})。 exception_name = com.rational.test.ft.SubitemNotFoundException
  • 我在 rvmankani@gmail.com 在线,如果您有时间可以聊聊。谢谢
  • 尝试先获取 HTML.Document 然后调用 find 。告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2020-05-16
  • 1970-01-01
  • 2014-07-20
相关资源
最近更新 更多