2012-05-07 183 views
0

我在Eclipse中運行帶有Java的selenium RC。我遇到的問題是使用selenium.click命令。我點擊的鏈接加載一個新頁面。有時需要5秒鐘,有時需要2-3分鐘。每當我看到頁面加載並且在我的測試失敗後立即收到消息「超時等待操作完成」。Selenium.click超時等待動作完成

我試着改用selenium.isElementPresent來檢查正在加載的頁面。但是,當我在調試模式下運行時,我發現它永遠不會超過selenium.click甚至到達檢查元素的地步。據我所知,有一個內置於selenium.click命令中的等待。所以我的問題是,有沒有人知道如何忽略內置的等待,所以我可以改爲使用selenium.isElementPresent?

selenium.click(Link); 
for (int i = 0; i < 60 ; i++) { 
    if (selenium.isElementPresent(Home)) { 
     break; 
    } 
    Thread.sleep(1000); 
} 

我也使用selenium.open直接去到URL和完全跳過鏈接,然後使用selenium.isElementPresent驗證頁面加載嘗試。我遇到了同樣的問題,在它出現相同的錯誤消息之前,它實際上從未真正進入for循環。

+0

你永遠不會去'for'語句。它應該是'for(int i = 0; i <60; i ++)' –

+0

我剛纔注意到了。錯字是在問題,但不是實際的代碼,所以我在這裏修復它。但同樣的問題仍然發生。 – Melekal

回答

1

我遇到過同樣的問題。我用try/catch封裝了click命令,以便捕獲錯誤,然後執行斷言標題並檢查頁面上的預期文本。

+0

實際上,用try/catch包圍它效果很好。我仍然可以捕獲錯誤,但不會讓我的測試失敗,因此我可以使用其他方法確認加載的頁面。感謝您的建議。 – Melekal

0

解決方案取決於您正在測試的應用程序的性質。如果點擊動作,加載一個新的頁面,那麼你可以使用硒的waitForPageToLoad命令如下:

selenium.click(Link); 
selenium.waitForPageToLoad(60000); 

注:參數是以毫秒爲單位的超時值。所以這將等待60秒來加載頁面。

也許該次點擊的最好的解決方法,並等待功能使用Selenium的waitForCondition方法,例如:

selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000); 

硒連續運行的isElementPresent方法,直到它返回true或到達指定爲第二個超時值參數。另外,selenium.waitForCondition可以運行selenium.isTextPresent,以便在繼續使用腳本之前檢查文本是否存在於屏幕上。

+0

其實我遇到的問題是我的測試永遠不會通過硒。點擊命令甚至可以進入selenium.waitForPageToLoad或selenium.waitForCondition。 selenium.click似乎有一個內置的等待,我似乎無法繞過使用任何其他驗證頁面已加載的方法。 – Melekal

1

我建議您將此方法/函數合併到您的代碼中。

public static void WaitForPageToLoad(IWebDriver driver) 
    { 
     TimeSpan timeout = new TimeSpan(0, 0, 2400); 
     WebDriverWait wait = new WebDriverWait(driver, timeout); 

     IJavaScriptExecutor javascript = driver as IJavaScriptExecutor; 
     if (javascript == null) 
      throw new ArgumentException("driver", "Driver must support javascript execution"); 

     wait.Until((d) => 
     { 
      try 
      { 
       string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString(); 
       return readyState.ToLower() == "complete"; 
      } 
      catch (InvalidOperationException e) 
      { 
       //Window is no longer available 
       return e.Message.ToLower().Contains("unable to get browser"); 
      } 
      catch (WebDriverException e) 
      { 
       //Browser is no longer available 
       return e.Message.ToLower().Contains("unable to connect"); 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     }); 
    } 

有時,硒的.Click()將等待自引用響應。爲了超越這一點,並讓您的測試繼續進行,我會使用您的代碼執行以下操作。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30)); 

    try{ selenium.click(Link); } 
    catch(WebDriverException) {} 
    WaitForPageToLoad(driver); 
    //look for your element. 

將它與隱式等待結合起來,一旦JavaScript報告頁面已完成加載,就可以查找您的元素。我發現它比在60秒內找不到元素的硒更有活力。