2014-10-20 23 views
3

我有一個編碼的UI測試方法:BrowserWindow.Uri屬性時.NavigateToUrl(URI URI)被稱爲

public void MyTestMethod() 
{ 
    string baseUrl = "www.google.com"; 
    GlobalVariable.browser = BrowserWindow.Launch(new System.Uri(baseUrl)); 
    GlobalVariable.browser.NavigateToUrl(new System.Uri(baseUrl + "/images")); 
    string expected = baseUrl + "/images"; 
    Assert.AreEqual(expected, GlobalVariable.browser.Uri); 
} 

然而,在GlobalVariable.browser.Uri斷言的時間價值仍然指向到www .google.com,即使瀏覽器已成功導航到預期。我試過設置一個Playback.Wait()以確保我沒有太早斷言。奇怪的是,這隻發生在一個或兩個開發環境(其他人顯示GlobalVariable.browser.Uri的正確值),導致我相信有一些環境變量而不是代碼問題。

此外,如果,代替靜態設置和更新GlobalVariable.browser對象,我們每次調用一個函數get我們稱之爲對象(像這樣:

private BrowserWindow _browser; 
public BrowserWindow browser 
{ 
    get 
    { 
     BrowserWindow currentWindow = BrowserWindow.FromProcess(_browser.Process); 
     return currentWindow; 
    } 
    set 
    { 
     _browser = value; 
     return _browser; 
    } 
} 

),則該對象是基於創建在系統過程中,並具有正確的屬性。所以基本上,在我們的初始化方法中創建的BrowserWindow對象在進行時並沒有得到更新,我們必須根據這個過程創建一個新的對象。同樣,這隻發生在一些遠程環境中,而不是在本地設置的開發機器上。我錯過了什麼?

回答

1

在一切僞裝之下既提供給navigateToURL和URI get方法委託其呼叫稱爲InternetExplorerWrapper一個內部類,這是一個COM包裝到窗口句柄Microsoft.VisualStudio.TestTools.UITesting.IEBrowserService。代碼在內部重複檢查UpdateWebBrowserReferenceIfInvalid()方法,並在需要時重新創建IEBrowserService實例。由於這種重複的檢查,我假設即使測試框架也不能保證它正在處理的IE實例「不在」「需要重新連接」。這取決於它創建的窗口句柄的生命週期,我猜。

總之,底層代碼反覆重新創建了IEBrowserService,它提供了你的Uri getter,並且它以非確定性的方式執行了這個操作,所以通過重複這個模式(按需創建瀏覽器窗口),你只是重複一個模式微軟人員本身在內部使用。

+0

我想我跟着你,這就是爲什麼我認爲這是愚蠢的從BrowserWindow.GetProcess得到一個新的進程()的作品,而只是調用該對象又沒有。除非你建議前者是因爲這是微軟的做法。 – 2014-11-04 00:56:15

+1

是的 - 看起來代碼在內部期望與IE的連接「隨機」不可用或丟棄,並根據需要重新創建連接。因此,您可能會看到基於舊對象的緩存URI;如果重新創建作品,那麼在您需要時重新創建對象似乎不會有太大的傷害。 – PhillipH 2014-11-04 09:17:52

相關問題