白いUIフレームワークを使用してフォームにDatagridを見つけることができません

StackOverflow https://stackoverflow.com/questions/9318605

質問

数日前、私のための自動UIテストケースを作成する要件を受け取りました Windowsアプリケーション (フレームワーク2.0)。

使用することにしました UIフレームワークのテストとして。今ではすべてがうまく機能しますが、私が見つけることができないようです Datagrid ホワイトフレームワークを使用して、3つのレコードを表示しているコントロール(注:これはDatagridViewではありません)

利用した VisualUiaverify 実際にデータグリッドがフォーム上にあり、それはUIアイテムタイプの「」であることを検証するためのアプリケーション「テーブル」そして、私は制御に正しいAutomationIDを明確に使用していますが、それでも運はありません。

前に述べたように、datagridを除くフォーム上のすべてのコントロールを見つけることができます。私は何か間違ったことをしていますか?それとも、白がDatagridをサポートしていないということです。

どんな助けも素晴らしいでしょう。ありがとう

ボビー

役に立ちましたか?

解決

最後に、Datagridを使用するのではなく、DatagridViewコントロールを使用するようにアプリケーションをアップグレードする必要がありました。白はデータグリッドをサポートしていないように見えるので、これは問題を解決するように見えました

他のヒント

ホワイトからデータグリッドへのアクセスが必要であり、なぜ白が機能しないのかを理解していません(ソースがあり、時間がある場合はそれを掘り下げた場合)、グリッドデータを抽出するための基本的なコードを書きました。配列。ありがたいことに、白いフレームワークは自動化されたものへのアクセスを提供します。

以下のコードは最適化されていません... Linqpadで一緒にノックされました!

// The first few lines use White
var application = Application.Attach("AppName");
var window = application.GetWindow("The Window Title");
var datagrid = window.Get<White.Core.UIItems.TableItems.Table>("dataGridAutomationId").AutomationElement;

// Now it's using UI Automation
var headerLine = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Header));
var cacheRequest = new CacheRequest { AutomationElementMode = AutomationElementMode.Full, TreeScope = TreeScope.Children };
cacheRequest.Add(AutomationElement.NameProperty);
cacheRequest.Add(ValuePattern.Pattern);
cacheRequest.Push();
var gridLines = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));
cacheRequest.Pop();

Console.WriteLine (headerLine.Count + " columns");
Console.WriteLine (gridLines.Count + " rows");

var gridData = new string[headerLine.Count, gridLines.Count];

var headerIndex = 0;
foreach (AutomationElement header in headerLine)
{
  gridData[headerIndex++, 0] = header.Current.Name;
}

var rowIndex = 1;
foreach (AutomationElement row in gridLines)
{
  foreach (AutomationElement col in row.CachedChildren)
  {
    // Marry up data with headers (for some reason the orders were different
    // when viewing in something like UISpy so this makes sure it's correct
    headerIndex = 0;
    for (headerIndex = 0; headerIndex < headerLine.Count; headerIndex++)
    {
      if (gridData[headerIndex, 0] == col.Cached.Name)
        break;
    }

    gridData[headerIndex, rowIndex] = (col.GetCachedPattern(ValuePattern.Pattern) as ValuePattern).Current.Value;
  }
  rowIndex++;
}

あなたのコードが十分ではないので、あなたが私とまったく同じ問題を抱えているかどうかはわかりませんが、実際に書かれたデータグリッドにアクセスしようとしているWPFアプリケーションでこの同じことに苦労していましたリストビュー内に住んでいたグリッドビューアイテム。

私の問題の解決策は、テーブルではなくListViewアイテム(IE TestStack.white.uiitems.listView)を取得するようにWhiteに指示することでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top