2011-04-02 41 views
4

我正在嘗試爲使用Caliburn.MicroWhite的WPF應用程序編寫一些UI自動化測試。我使用CM的內置約定將我的控件綁定到視圖模型的屬性和方法。我也使用Conductor類,以便我可以在單個屏幕上顯示多個視圖。這通常意味着屏幕上的多個控件最終可能具有相同的x:Name值。它會被綁定到不同的視圖模型。我想要做的一個好主意可以在HelloScreens sample application that comes with CM中看到。使用Caliburn.Micro進行WPF UI自動化?

我正在運行的問題是,我將擁有多個具有相同x:Name屬性的XAML元素,以便CM可以處理我的所有綁定工作。這不幸意味着多個UIItem對象將具有相同的UI自動化ID。我發現得到的,例如,唯一的方法,不同的TextBlock元素與x:Name="DisplayName"是撥打電話,如以下幾點:

SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1); 
WPFLabel label = myWindow.Get<WPFLabel>(criteria); 

這意味着我的測試需要知道確切的順序是不同的控件放置在屏幕顯得非常脆弱。通過添加另一個視圖模型,我可以看到我的測試全部打破。

  • 是否有一種方法可以指定自動化ID,而不是使用x:Name屬性?
  • 如果我直接使用UI自動化框架而不是使用White,這會更容易嗎?
  • 或者,我是否真的必須放棄CM的基於約定的綁定,並賦予每個唯一的x:Name值並手動綁定它們?

修訂

爲了澄清我的意思有一次多個視圖可見,這裏是我的總體佈局。我有我的ShellViewModel,我從Conductor<IScreen>.Collection.OneActive得到。然後我的視圖有一個ItemsControl,它綁定到shell視圖模型的Items屬性。每個項目模板都顯示一個按鈕,用於將特定的IScreen加載到殼體視圖上的ContentControl中。所以,如果我嘗試尋找x:Name="DisplayName"的元素,我在shell視圖上有標籤,ItemsControl中的按鈕上的標籤以及ContentControl中的標籤。

+0

當你說你在一個屏幕上有多個視圖可見時,你使用的導體類型是什麼?導體或導體。收集。所有活動等? – devdigital 2011-04-03 16:48:05

+0

我已更新帖子以澄清我的確切設置。讓我知道你是否需要更多信息。 – 2011-04-03 22:32:35

回答

5

雖然AutomationId默認來自x:Name屬性,但您可以通過設置AutomationProperties.AutomationId來覆蓋它。

+0

哇。這將是一個更好的解決方案。我沒有注意到WPF中有一個附加屬性。今晚我會說這個。 – 2011-04-07 19:49:31

+0

像魅力一樣工作。我能夠維護CM的默認約定,並給出我想要測試有意義標識符的控件。謝謝塞繆爾。 – 2011-04-08 11:18:36

+0

@哈里 - 很高興幫助! – 2011-04-08 11:39:15

1

一個選項可能是更改類型上的BindPropertiesBindActions代表以使用名稱根據其所屬視圖而更改的控件名稱。

例如,您可以選擇將視圖名稱作爲前綴添加到每個可能在其他視圖中具有重複名稱的控件。因此DisplayName可能成爲ListViewDisplayNameContentViewDisplayName

在繼續處理控件之前,控件名稱中包含單詞'View'的任何文本都可以被剝離以形成乾淨的控件名稱。

+0

當然,如果約定不起作用,那就改變約定。這實際上會很有效地解決我的問題。感謝你這麼好的想法。 – 2011-04-04 23:16:47