在TestComplete中使用第三方树对象

时间:2012-04-12 18:34:25

标签: delphi testcomplete

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

如果我只是做以下事情......

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

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

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要使用调试信息编译应用程序,以便 TestComplete 调试信息代理可以为工具提供对控件的所有本机方法和属性的访问权限。一旦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;