2013-06-03 79 views
4

當我從www網站上的測試切換到我的本地主機版本時,此問題就開始了。在VS 2012中工作時,我將開始調試,以便本地主機處於活動狀態,分離進程以便測試,然後運行我喜歡的任何測試。對於一個非常簡單的例子:C#Webdriver - 在頁面加載之前,頁面標題斷言失敗

[Test] 
    public void CanGoToHomePage() 
    { 
     Pages.HomePage.Goto(); 
     Assert.IsTrue(Pages.HomePage.IsAt()); 
    } 

而且它的函數引用在這裏:

public class HomePage 
    { 
     const string Url = "http://localhost:3738"; 
     const string HomepageTitle = "FunnelFire - Home Page"; 

     public void Goto() 
     { 
      Browser.Goto(Url); 
     } 

     public bool IsAt() 
     { 
      return Browser.Title == HomepageTitle; 
     } 
    } 

和實際硒代碼在這裏:

public static class Browser 
    { 
     static IWebDriver webDriver = new FirefoxDriver(); 

     public static void Goto(string url) 
     { 
      webDriver.Manage().Window.Maximize(); 
      webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
      webDriver.Url = url; 
     } 
    } 

現在的問題。我在瀏覽器中添加的10秒隱式等待在加載頁面後最多等待10秒,以查看它是否可以找到我希望它找到的任何信息,這不是問題。

正如我前面所說的,在我切換到localhost測試後,突然間遇到了一個奇怪的問題,即頁面開始加載(即屏幕仍然完全白色,沒有完成),甚至有時候下一頁幾乎沒有完成加載並突然測試會剛剛啓動並失敗,指向IsAt的Assert將返回false,即使它正在加載的頁面是正確的。我可以立即再次運行該測試,並且可以順利通過。運行它第三次,它可能會再次隨機失敗。我真的不知道是什麼原因造成的問題,任何幫助將不勝感激!

+0

你可以嘗試在調試模式下運行項目嗎?在這種情況下你仍然得到相同的結果嗎? –

+0

首先,刪除隱式等待。不要一直調用它,只需調用一次,它就是爲了駕駛員的生命而設置的。這是什麼版本的Firefox和Selenium?我建議在** Selenium嘗試訪問該頁面時,**在一個單獨的瀏覽器實例中手動訪問該頁面。這將有助於表明硒是否真的是問題。 – Arran

+0

@Pat:我確實嘗試了「無需調試即可開始」,它似乎使問題不再頻繁,但仍然存在。 –

回答

6

隱式等待工作只有查找元素。爲了等待頁面的標題爲特定值,您需要使用明確的等待。您可以編寫您自己的此模式版本,但在.NET綁定中,WebDriver.Support.dll程序集有一個WebDriverWait類來幫助完成此操作。它的使用將是這個樣子:

// WARNING! Untested code written from memory below. It has not 
// been tested or even compiled in an IDE, so may be syntactically 
// incorrect. The concept, however, should still be valid. 
public void WaitForTitle(IWebDriver driver, string title, TimeSpan timeout) 
{ 
    WebDriverWait wait = new WebDriverWait(driver, timeout); 
    wait.Until((d) => { return d.Title == title; }); 
} 

你甚至可以修改您的IsAt的方法來使用這個模式,捕捉WebDriverTimeoutException如果等待功能超時返回false。

+0

嗨吉姆,我似乎無法正確地得到我的代碼塊在評論這裏像你的,但我用你在那裏寫了很小的調整和修改我的IsAt()使用try/catch與WebDriverTimeoutException。它編譯併成功地到達了主頁,並且到目前爲止還是真實的,所以希望這能夠解決這個問題(儘管我永遠不會知道,除非我最終失敗了一些哈哈)。非常感謝你的幫助! –

+1

然後隨意接受答案作爲正確的答案。並且可以通過點擊評論編輯欄旁邊的「幫助」鏈接來顯示迷你Markdown標籤。將評論標記爲塊的方式與主要問題和答案相同,方法是用反引號(')來包圍該術語。 – JimEvans