2017-01-09 35 views
1

在Xamarin UITest(使用葫蘆)我可以查詢有some text,像這樣的元素:Xamarin UITest(葫蘆)查詢的非空文本屬性

app.WaitForElement(x => x.Marked("MyTextControl") 
        .Property("text") 
        .Contains("some text")); 

我在reference docs看到有還有BEGINSWITH,LIKE等等,但是我沒有看到任何一種IsEmpty或IsNotEmpty。有沒有辦法找到一個文本不是空的元素?我期待看到一個長的方法,所以我可以做類似:

app.WaitForElement(x => x.Marked("MyTextControl") 
        .Property("text") 
        .Length() > 0); 

是否有另一種方式來完成我所追求的?

回答

2

對於具體問題,我不相信有可能在UITest API的特定查詢中完成此操作。最好的解決方法是@Zil建議的內容並查詢特定標識符的所有元素,然後遍歷它們以找到您正在查找的內容,或類似於該想法的內容。

2

我這樣做,爲UILabels。我不認爲它適用於UIButtons,對於那些在AppResult[]中需要深入挖掘的按鈕,它應該是可以單獨使用的,當我使用UITest時,我從來沒有機會在按鈕中顯示文本。

AppResult[] labelContainer = app.WaitForElement(x => x.Marked("MyTextControl"); 
AppResult label = labelContainer[0]; 

你總是在陣列中的至少一個元素,否則WaitForElement失敗。所以在這裏沒有出界的風險。

現在我們確定有文字,應該專門回答你的問題。

Assert.IsFalse(string.IsNullOrEmpty(label.Text)); 

如果你想成爲thourough你可以申請下一行的for loop測試項目的給定數組中的每個元素。

for (int i = 0; i < labelContainer.Length ; i++) 
{ 
    AppResult label = labelContainer[i]; 
    Assert.IsFalse(string.IsNullOrEmpty(label.Text)); 
} 

當然,你可以做一個擴展方法,做這一切對於一個給定的標誌,或者一個行它像這樣:

Assert.IsFalse(string.IsNullOrEmpty(app.WaitForElement(x => x.Marked("MyTextControl")[0].Text)); 

而這一切你應該是一個幸福的男人接下來的幾分鐘:)

+0

如果我沒有弄錯,當你想斷言具有給定標識符的所有元素都是非空的,但是當你想查詢找到具有給定標識符的_only_元素時,非空,或者當您想要等待具有給定標識符_becomes_非空的元素時。 (我需要做後者。)我可以用循環,Thread.Sleep和自定義超時來破解它,但這更像是一種解決方法。看起來像Calabash查詢本身應該是可能的。 –

+1

>我認爲它不適用於UIButtons text屬性將是按鈕的標題(如果有的話)。 – jmoody

+0

@Zy我建議將第一個例子更新爲:'AppResult label = labelContainer?.FirstOrDefault();',因爲如果數組是空的,則使用FirstOrDefault()將返回null,而引用索引0,'[0 ]'會在數組爲空時拋出'NullReferenceException'或'ArrayIndexOutOfBounds'異常。我發現這很有幫助,因爲有時候這個元素不會出現在屏幕上。以下是我在GitHub中的示例:https://github.com/brminnick/UITestSampleApp/blob/master/UITestSampleApp/UITestSampleApp.UITests/Pages/ListPage.cs#L40 –