2017-02-21 6 views
0

私はTestStack White frameworkを使用してWPFアプリケーションのテストを自動化します モーダルウィンドウを開き、TextBoxにアクセスする必要があります。すべてがうまく動作しますが、ホワイトは、テキストボックスを見つけることができない、それは窓TestStackホワイトはWPFアプリケーションでTextBoxを見つけません

の他の要素を見つけたが、私は次のコード行を試みた:私も試したCreateBranchがモーダルウィンドウ

ある

TestStack.White.UIItems.TextBox TextBox = CreateBranch.Get<TestStack.White.UIItems.TextBox>(SearchCriteria.byAutomationId("Title")); 

を(SearchCriteria.All)、(SearchCriteria.ByControlType)と何が

コード化されたUIツールがたAutomationIDでも、この要素を見つけ動作しますが、私はホワイト

でそれを行う必要があります

UISpyおよび他の同様のツールは、このテキストボックスは、カスタムコントロールでこのコントロールを認識し、そのたAutomationID

を参照してください、ここではそのためのコードはだ、私はプライバシーのために名前空間の名前を変更:

using System; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Input; 
using System.Windows.Interactivity; 
using System.Windows.Media; 

namespace Test.Wpf.Controls.XTextBox 
{ 
    [TemplatePart(Name = "PART_Watermark", Type = typeof(TextBlock))] 
    [TemplatePart(Name = "PART_Pasword", Type = typeof(TextBlock))] 
    public class XTextBox : TextBox 
    { 
     #region Static 
     static XTextBox() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(XTextBox), new FrameworkPropertyMetadata(typeof(XTextBox))); 
     } 
     #endregion //Static 

     #region Fields 

     private TextBlock PART_Watermark; 
     private TextBlock PART_Pasword; 

     #endregion //Fields 

     #region DependencyProperties 

     public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register(
      "Watermark", 
      typeof(String), 
      typeof(XTextBox), 
      new PropertyMetadata(String.Empty)); 

     public static readonly DependencyProperty WatermarkVerticalAlignmentProperty = DependencyProperty.Register(
      "WatermarkVerticalAlignment", 
      typeof(VerticalAlignment), 
      typeof(XTextBox), 
      new PropertyMetadata(VerticalAlignment.Stretch)); 

     public static readonly DependencyProperty WatermarkForegroundProperty = DependencyProperty.Register(
      "WatermarkForeground", 
      typeof(Brush), 
      typeof(XTextBox), 
      new PropertyMetadata(new SolidColorBrush(Colors.Black))); 

     public static readonly DependencyProperty WatermarkFontSizeProperty = DependencyProperty.Register(
      "WatermarkFontSize", 
      typeof(Double), 
      typeof(XTextBox), 
      new PropertyMetadata(12.0)); 

     public static readonly DependencyProperty IsFloatingProperty = DependencyProperty.Register(
      "IsFloating", 
      typeof(Boolean), 
      typeof(XTextBox), 
      new PropertyMetadata(false)); 

     public static readonly DependencyProperty IsAccessNegativeProperty = DependencyProperty.Register(
      "IsAccessNegative", 
      typeof(Boolean), 
      typeof(XTextBox), 
      new PropertyMetadata(true)); 

     public static readonly DependencyProperty IsDigitOnlyProperty = DependencyProperty.Register(
      "IsDigitOnly", 
      typeof(Boolean), 
      typeof(XTextBox), 
      new PropertyMetadata(false)); 

     public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register(
      "MaxValue", 
      typeof(Single), 
      typeof(XTextBox), 
      new PropertyMetadata(Single.NaN)); 

     public static readonly DependencyProperty IsPasswordProperty = DependencyProperty.Register(
      "IsPassword", 
      typeof(Boolean), 
      typeof(XTextBox), 
      new PropertyMetadata(false)); 

     public static readonly DependencyProperty VisibilityMainTextProperty = DependencyProperty.Register(
      "VisibilityMainText", 
      typeof(Visibility), 
      typeof(XTextBox), 
      new PropertyMetadata(Visibility.Visible)); 

     #endregion //DependencyProperties 

     #region Properties 
     [Description("Gets or sets the watermark title")] 
     public String Watermark 
     { 
      get { return (String)GetValue(WatermarkProperty); } 
      set { SetValue(WatermarkProperty, value); } 
     } 

     [Description("Gets or sets the watermark vertical alignment")] 
     public VerticalAlignment WatermarkVerticalAlignment 
     { 
      get { return (VerticalAlignment)GetValue(WatermarkVerticalAlignmentProperty); } 
      set { SetValue(WatermarkVerticalAlignmentProperty, value); } 
     } 


     [Description("Gets or sets the watermark title color")] 
     public Brush WatermarkForeground 
     { 
      get { return (Brush)GetValue(WatermarkVerticalAlignmentProperty); } 
      set { SetValue(WatermarkVerticalAlignmentProperty, value); } 
     } 

     [Description("Gets or sets the watermark title font size")] 
     public Double WatermarkFontSize 
     { 
      get { return (Double)GetValue(WatermarkVerticalAlignmentProperty); } 
      set { SetValue(WatermarkVerticalAlignmentProperty, value); } 
     } 

     [Description("Gets or sets the textbox floating mode")] 
     public Boolean IsFloating 
     { 
      get { return (Boolean)GetValue(IsFloatingProperty); } 
      set { SetValue(IsFloatingProperty, value); } 
     } 

     [Description("Gets or sets the textbox access of negative values")] 
     public Boolean IsAccessNegative 
     { 
      get { return (Boolean)GetValue(IsAccessNegativeProperty); } 
      set { SetValue(IsAccessNegativeProperty, value); } 
     } 

     [Description("Gets or sets the textbox chars type")] 
     public Boolean IsDigitOnly 
     { 
      get { return (Boolean)GetValue(IsDigitOnlyProperty); } 
      set { SetValue(IsDigitOnlyProperty, value); } 
     } 

     [Description("Gets or sets the max input value (enable in digit mode only)")] 
     public Single MaxValue 
     { 
      get { return (Single)GetValue(MaxValueProperty); } 
      set { SetValue(MaxValueProperty, value); } 
     } 

     [Description("Gets or sets the textbox is passwordbox")] 
     public Boolean IsPassword 
     { 
      get { return (Boolean)GetValue(IsPasswordProperty); } 
      set { SetValue(IsPasswordProperty, value); } 
     } 

     public Visibility VisibilityMainText 
     { 
      get { return (Visibility)GetValue(VisibilityMainTextProperty); } 
      set { SetValue(VisibilityMainTextProperty, value); } 
     } 

     #endregion //Properties 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 
      PART_Watermark = GetTemplateChild("PART_Watermark") as TextBlock; 
      PART_Pasword = GetTemplateChild("PART_Pasword") as TextBlock; 
      SetWatermarkVisibility(); 
      if (IsPassword) 
      { 
       VisibilityMainText = Visibility.Collapsed; 
       if (PART_Pasword != null) 
       { 
        PART_Pasword.Visibility = Visibility.Visible; 
        PART_Pasword.FontSize = 20; 
       } 
      } 
      else 
      { 
       VisibilityMainText = Visibility.Visible; 
      } 

      DataObject.AddPastingHandler(this, OnPaste); 
     } 

     protected void OnPaste(Object sender, DataObjectPastingEventArgs e) 
     { 
      try 
      { 
       var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); 
       if (!isText) return; 
       var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as String; 
       if (!String.IsNullOrEmpty(text)) 
       { 
        if (IsDigitOnly) 
        { 
         if (!IsAccessNegative) 
         { 
          var ch = text[0]; 
          if (ch == 45) 
          { 
           e.CancelCommand(); 
          } 
         } 
         for (int i = 0; i < text.Length; i++) 
         { 
          if (i == 0) 
          { 
           if (IsAccessNegative && text[i] == 45) 
           { 
            continue; 
           } 
          } 
          if (!Char.IsDigit(text[0])) 
           e.CancelCommand(); 
         } 
        } 
       } 
      } 
      catch (Exception) 
      { 
       // ignored 
       e.Handled = true; 
      } 
     } 

     protected override void OnTextChanged(TextChangedEventArgs e) 
     { 
      base.OnTextChanged(e); 
      SetWatermarkVisibility(); 
      if (IsPassword) 
      { 
       PART_Pasword.Text = new String('•', Text.Length); 
      } 
     } 

     protected override void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e) 
     { 
      base.OnLostKeyboardFocus(e); 
      SetWatermarkVisibility(); 
     } 

     protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e) 
     { 
      base.OnGotKeyboardFocus(e); 
      if (PART_Watermark != null) 
      { 
       PART_Watermark.Visibility = Visibility.Hidden; 
      } 
     } 

     protected override void OnPreviewTextInput(TextCompositionEventArgs e) 
     { 
      base.OnPreviewTextInput(e); 
      if (e.Text.Length == 0) 
      { 
       e.Handled = true; 
       return; 
      } 
      if (IsDigitOnly) 
      { 
       var ch = e.Text[0]; 
       if (!Char.IsDigit(ch) && ch != 8 && ch != 46) 
       { 
        if (!(IsAccessNegative && ch == 45)) 
         e.Handled = true; 
       } 
       if (IsFloating) 
       { 
        if (ch == 46 && Text.IndexOf('.') != -1) 
        { 
         e.Handled = true; 
         return; 
        } 
       } 

       if (!IsAccessNegative) 
       { 
        if (ch == 45) 
        { 
         e.Handled = true; 
        } 
       } 
      } 
     } 

     #region Private 

     private void SetWatermarkVisibility() 
     { 
      if (PART_Watermark != null) 
      { 
       PART_Watermark.Visibility = (Text != String.Empty || IsKeyboardFocused)? Visibility.Hidden : Visibility.Visible; 
      } 
     } 
     #endregion 
    } 
} 

Screenshot from UISpy

+0

に、あなたは窓を見つけるためのコードなどのためUISpys出力のスクリーンショットを投稿できます問題のテキストボックス?私は一般的に、ウィンドウ上でコントロールを見つけることができないとき、私は誤って別のウィンドウを見つけました。一般に、ウィンドウはツールチップなどになります。 –

+0

アプリケーション= TestStack.White.Application.Launch(ApplicationPath); TestStack.White.UIItems.WindowItems.Window mainWindow = application.GetWindow(SearchCriteria.ByText( "title")、TestStack.White.Factory.InitializeOption.NoCache); //モーダルウィンドウを開くためのアクションを実行し、開いたときには TestStack.White.UIItems.WindowItems.Window CreateBranch = mainWindow.ModalWindow(SearchCriteria.All); スクリーンショットが追加されました。編集には2つのスクロールバーがありますが、使用されていません。 AutomationPeerの追加でDLDRのアドバイスを使用しようとしたときに、コントロールがカスタムではなく編集として認識されました –

答えて

0

私にしてみましょうそれは

TextBox = (TextBox)CreateBranch 
     .Get(SearchCriteria.ByAutomationId("Title").AndOfFramework(WindowsFramework.Wpf)); 

エドを動作するかどうか知っていますited後の新しいソースは、カスタムコントロールのための具体的なAutomationPeerを作成し、方法OnCreateAutomationPeer()のオーバーライドを経由して、それを返す必要が

を追加しました。

コントロールはTextBoxコントロールのサブクラスなので、新しいTextBoxAutomationPeerインスタンスを返すか、カスタムのAutomationPeerを作成するだけで済みます。

public class XTextBox : TextBox 
{ 
... 
    protected override AutomationPeer OnCreateAutomationPeer() 
    { 
     return new XTextBoxAutomationPeer(this); 
     // or just use the TextBoxAutomationPeer 
     // return new TextBoxAutomationPeer(this); 
    } 
... 
} 

カスタムオートメーションピア

public class XTextBoxAutomationPeer : TextBoxAutomationPeer 
{ 
    public XTextBoxAutomationPeer(XTextBox owner) 
     : base(owner) 
    { 
    } 

    protected override string GetClassNameCore() 
    { 
     return "XTextBox"; 
    } 
} 
+0

いいえ、動作しません。 –

+0

テキストボックスはカスタムコントロールですか? XAMLコードを提供できますか?ここ – DLDR

+0

は、XAMLコードである: "...ここにタイトルを入力します" とXTextBoxがあります。 csですので、カスタムコントロールです。私はそれを標準コントロールとしてどのように扱うことができますか、それとも何ができるのでしょうか? –

0
[SetUpFixture] 
    public class SETUP_THAT_WILL_GET_CALL_LATER 
    { 
     [OneTimeSetUp] 
     public void OneTimeSetUp() 
     { 
      var applicationDirectory = TestContext.CurrentContext.TestDirectory; 
      var applicationPath = Path.Combine(applicationDirectory, @"..\..\..\, "your debug folder path here", "your application.exe here"); 
      Application = Application.Launch(applicationPath); 

      Thread.Sleep(2000); 

      Window = Application.GetWindow("Title of your application", InitializeOption.WithCache); 
     } 

     [OneTimeTearDown()] 
     public void OneTimeTearDown() 
     { 
      Window.Dispose(); 
      Application.Dispose(); 
     } 

     public static Application Application; 
     public static Window Window; 
    } 

は、その後、あなたのテスト

[Test] 
public void yourtest() 
{ 
    var textBox = SETUP_THAT_WILL_GET_CALL_LATER.**Window.Get<TextBox>("Your textbox name here");** 

} 
+0

を追加して、私は元の質問 –

+0

を助けていない、私はより多くのコード – user7583356

+0

すべてのステップの後に、より長い睡眠が追加されました。 –

関連する問題