2013-11-20 22 views
1

我正在寫一個使用C#,Ranorex dll庫和Xpath表達式作爲我的定位器的自動化測試。這一切都很好,但在某些情況下我想使用的if else語句從可能的2周的XPath選擇適當的XPath:C#如果Else語句選擇適當的Xpath表達式

Public class Locators 
{ 
    public const string Xpathone = "//form[@controlname='x1']"; 
    public const string Xpathtwo = "//form[@controlname='x2']"; 
} 


Step Definition 
[Binding] 
public class HomePageSteps 
{ 
    public void SelectAppropriateXpath() 
    { 
     Validate.Exists(HomePage.Header, Config.ExistsTimeOut); 
     if (Validate.Exists(HomePage.Xpathone))==true 
     { 
      mouse.click(HomePage.Xpathone); 
     } 
     else 
     { 
      mouse.click(HomePage.Xpathtwo); 
     } 
    } 

但我仍然得到一個錯誤:當我

Cannot implicitly convert type 'void' to 'bool'

即使更改類型爲bool:

public bool SelectAppropriateXpath()

錯誤仍然存​​在,這讓我很困惑。當我使用'公共布爾'我也得到:

Error - not all code paths return a value

任何想法將不勝感激?

+3

或者:完全刪除'if':'mose.click(Validate.Exists(HomePage.Xpathone)?HomePage.Xpathone:HomePage.Xpathtwo);' –

+1

'Validate.Exists'確實返回'bool'嗎? –

+0

@Marc Gravell'mouse.click(Validate.Exists(HomePage.Xpathone)?HomePage.Xpathone:HomePage.Xpathtwo);'我喜歡這個例子,並不知道這是可能的。但是我仍然得到一個錯誤:**不能隱式地將類型'void'轉換爲'bool'** @Hans Kesting xpaths與網頁上的元素相關,它們可以有所不同,但我希望以任何方式繼續測試。根據方法doc是它可以[http://www.ranorex.com/Documentation/Ranorex/html/Overload_Ranorex_Validate_Exists.htm] –

回答

1

儘管Validate.Exists({xpath})會向報表寫入適當的項目,但函數本身不會返回值,但在使用ranorex時要記住一些事項。

Ranorex documentation for this function

的正確超載使用是這個:

Validate with bool return value

因此,對於這一點,如果你的其他函數調用應該是這樣的:

if(Validate.Exists(HomePage.Xpathone, {Time Duration}, {Log Message}, false)) 
{ 
} 

的==因爲您將bool值與bool進行比較,所以此語句的真正部分是不必要的。

上面的答案很遺憾不起作用,因爲您使用的驗證函數沒有返回值。

+0

這是完全正確的答案。做得很好。我的方法現在看起來像這樣(使用bool Validate.Exists): bool item = Validate.Exists(ActiveCase.CaseOwnerSubtext,Config.WhileLoopPollingTime,「Found」,false); –

-1

下面的代碼peice的是不正確的:

if (Validate.Exists(HomePage.Xpathone))==true 

它應該是:

if (Validate.Exists(HomePage.Xpathone) == true) 
+2

不,它不應該。 '== true'是愚蠢的。 –

+1

它是如何愚蠢?明確表示沒有錯。 – Tobberoth

1

我不認爲具有條件邏輯的步驟是一個很不錯的主意(假設你是使用SpecFlow或其他驗收測試工具)。測試應該是consistent。考慮爲每個條件創建兩個不同的步驟。例如。 (當然,這是更好地使用領域特定語言的點擊,而不是等):

Given your state 
And x1 exists 
When click on x1 
Then results 

Given your state 
And x1 not exists 
When click on x2 
Then other results 

如果你不處理測試,那麼我建議你消除鼠標點擊的重複,因此實際上你有完全相同的邏輯,唯一路徑正在發生變化:

var path = Validate.Exists(HomePage.Xpathone) ? HomePage.Xpathone : HomePage.Xpathtwo; 
mouse.click(path); 
+1

最終這可能是更有幫助的答案。 – Ashigore

+0

@Ashigore謝謝,從編碼的角度來看,你的回答也是完全正確的 –

+0

根據你的建議,我所有的步驟定義方法都是這樣完成的,我的框架工作是在頁面對象模式中設計的。但我認爲在這種情況下,一個方法可以有20個動作,而不是兩次複製該方法,因爲1個動作可能會有所不同。因此,我計劃使用IfEse。 –

3

乍一看,你在你的代碼中的錯誤:

if (Validate.Exists(HomePage.Xpathone))==true 

應該是:

if (Validate.Exists(HomePage.Xpathone)) 
+0

感謝您在建議的正確代碼中沒有「== true」。 – bland

+0

謝謝是的,我刪除了不必要的代碼。 –