2012-04-12 504 views
1

我在嘗試改進一個包含類TElTreeView的第三方Delphi樹的腳本。我可以找到指定的項目,我想單擊並展開ElTree1對象,但我似乎無法通過TC腳本訪問它的索引值。我需要對物品進行檢查,展開,並在其下面設置一些相應的子物品。在TestComplete中使用第三方樹對象

如果我只是做了以下...

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

...那麼默認情況下,突出時,將檢查窗口打開的行項目。我已經嘗試了很多其他的東西,但是到目前爲止還沒有任何運氣。我試圖避免使用Sys.Keys。

任何想法?

謝謝!

+0

你看過這個「http://support.smartbear.com/viewarticle/15139/」嗎? – JerseyMike 2012-04-13 13:01:28

回答

2

您需要編譯調試信息的應用程序,以便TestComplete調試信息代理可以提供工具與訪問控制的所有本地方法和屬性。一旦TestComplete可以找到調試信息,你可以以這種方式訪問​​樹項目:關於如何正確編譯與Debug Info Agent幫助主題調試信息TestComplete Delphi應用程序

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

查找細節。單擊與您的Delphi版本相對應的鏈接以獲取步驟。

此外,您還可以在未來版本的TestComplete中爲您的控件投票支持this survey

更新:

雖然TestComplete沒有爲TElTreeView控制像其他一些廣泛分佈樹視圖控件的擴展支持,它是更多鈔票,以用於控制在工作創建腳本程序一個高層次。這些例程將使用TestComplete的開放式應用程序功能通過其本地方法和屬性來處理樹控件。下面的示例腳本演示瞭如何做到這一點。

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; 
+0

謝謝你的迴應!我正在使用一個.tds文件,因此可能是我缺乏知識,我無法弄清楚。 :) 我正在閱讀以下... http://support.smartbear.com/viewarticle/15099/#LabelIndex ...並想知道如何設置項目號定義爲'項目(1)'與樹的根一起工作?看起來定義的數字選擇了所選樹的子項目,是否正確?我嘗試了一些不同的東西,但最後一行代碼似乎沒有爲我做任何事情(雖然測試仍然通過TC - 去圖!)。 再次感謝! – GreenMtnGal 2012-04-13 20:56:05

+0

通過TestComplete本機支持的控件可以通過其標題處理樹視圖的項目。這種方式不支持TElTreeView控件,但您仍然可以在腳本中實現所需的功能。我用這樣的腳本樣本更新了我的答案。 – 2012-04-16 09:30:37

+0

非常棒 - 謝謝!我今天一直在玩這個遊戲,並且幾乎都有效。您的問題 - 我一直使用.makevisible命令收到「未知名稱」錯誤。它應該做什麼? – GreenMtnGal 2012-04-16 17:36:34