【问题标题】:Working with a third party tree object in TestComplete在 TestComplete 中使用第三方树对象
【发布时间】:2012-04-12 18:34:25
【问题描述】:

我正在尝试改进包含 TElTreeView 类的第三方 Delphi 树的脚本。我可以在 ElTree1 对象中找到我想要单击并展开的指定项目,但我似乎无法通过 TC 脚本通过其索引值访问它。我需要检查、扩展该项目并相应地设置它下面的几个子项目。

如果我只是执行以下操作...

w := p.frmOpts;
tvw := w.VCLObject('ElTree1');
tvw.Selected.Checked := true;

...然后将检查打开窗口时默认突出显示的行项目。我已经尝试了很多其他的东西,但到目前为止还没有运气。我试图避免使用 Sys.Keys。

有什么想法吗?

谢谢!

【问题讨论】:

标签: delphi testcomplete


【解决方案1】:

您需要使用调试信息编译您的应用程序,以便 TestCompleteDebug Info Agent 可以为该工具提供对所有本机方法和控件属性的访问。一旦 TestComplete 可以找到调试信息,您就可以通过以下方式访问树项:

procedure Test;
  ...
  w := p.frmOpts;
  tvw := w.VCLObject('ElTree1');
  tvw.Items.Item(1).Checked := true;
end;

Debug Info Agent 帮助主题中查找有关如何正确编译带有TestComplete 调试信息的Delphi 应用程序的详细信息。单击与您的 Delphi 版本对应的链接以获取步骤。

此外,您可以在 this survey 中投票支持您的控件在未来版本的 TestComplete 中的高级支持。

更新:

尽管 TestComplete 不像其他一些广泛使用的树视图控件那样对 TElTreeView 控件提供扩展支持,但可以创建脚本例程以在高级别的控件上工作.这些例程将使用 TestComplete 的 Open Application 功能通过其本机方法和属性与树控件一起工作。下面的示例脚本演示了如何做到这一点。

function getTreeNode(tree, nodeName); forward;
function clickTreeNode(tree, node); forward;

procedure test;
var
  tree;
  nodeName;
  node;
begin
  tree := Sys.Process('ElTreeTest').VCLObject('Form1').VCLObject('ElPanel1').VCLObject('ElTree1');
  nodeName := 'Item B|Item BB|Item BBA';
  node := getTreeNode(tree, nodeName);
  if node <> nil then
    Log.Message(node.Caption)
  else
  begin
    Log.Error('Node "' + nodeName + '" not found');
    Runner.Stop;
  end;

  node.MakeVisible;
  node.Checked := not node.Checked;
  clickTreeNode(tree, node);
end;

function clickTreeNode(tree, node);
var
  x, y;
begin
  node.MakeVisible;
  x := (node.TextRect.Left + node.TextRect.Right) / 2;
  y := (node.TextRect.Top + node.TextRect.Bottom) / 2;
  tree.Click(x, y);
end;

function getTreeChildNode(rootNode, nodeName);
var
  i;
  item;
  nodeCaption;
begin
  result := nil;
  if rootNode = nil then
    exit;

  nodeCaption := aqString.GetListItem(nodeName, 0);

  for i := 0 to rootNode.ChildrenCount - 1 do
  begin
    item := rootNode.Children(i);
    if item.Caption = nodeCaption then
    begin
      result := item;
      break;
    end;
  end;

  if aqString.GetListLength(nodeName) > 1 then
    result := getTreeChildNode(result, aqString.DeleteListItem(nodeName, 0));
end;

function getTreeNode(tree, nodeName);
var
  rootNodeCaption;
  item;
  i;
begin
  aqString.ListSeparator := '|';
  rootNodeCaption := aqString.GetListItem(nodeName, 0);
  result := nil;

  for i := 0 to tree.Items.Count - 1 do
  begin
    item := tree.Items.Item(i);
    if item.Parent = nil then
    begin
      if item.Caption = rootNodeCaption then
      begin
        result := item;
        break;
      end;
    end;
  end;

  if aqString.GetListLength(nodeName) > 1 then
    result := getTreeChildNode(result, aqString.DeleteListItem(nodeName, 0));
end;

【讨论】:

  • 感谢您的回复!我正在使用 .tds 文件,所以可能是我缺乏知识,我无法弄清楚。 :) 我正在阅读以下内容...support.smartbear.com/viewarticle/15099/#LabelIndex ...并且想知道如何将定义为“Item(1)”的项目编号设置为与树的根一起使用?看来定义的数字选择了所选树的子项,对吗?我尝试了一些不同的东西,但最后一行代码似乎对我没有任何作用(尽管测试仍然在 TC 中通过 - 去看看!)。再次感谢!
  • 对于 TestComplete 原生支持的控件,可以通过标题处理树视图中的项目。这种方式不支持 TElTreeView 控件,但您仍然可以在脚本中实现所需的功能。我已经用这样的脚本示例更新了我的答案。
  • 太棒了 - 谢谢!我今天一直在玩这个,几乎可以正常工作。给你的问题 - 我不断收到 .makevisible 命令的“未知名称”错误。它应该做什么?
  • 还有一个...如果我注释掉 .makevisible 行,我会卡在 textrect 上。我无法使用 TC 资源管理器找到该属性(脚本运行时出现“未知名称 - textrect”错误)。很近!再次感谢!
  • MakeVisible 是一种本机方法,它扩展指定节点的所有父节点,以确保它在屏幕上可见。 TextRect 是一个原生属性,包含树控件中指定节点文本的坐标。如果 TestComplete 找不到这些成员,则很可能该工具无法找到或读取被测应用程序的调试信息。要检查TestComplete是否读取了调试信息,在对象浏览器中选择树对象,检查除了'Standard'、'RTTI'等是否还有'Debug Agent'属性组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多