2014-11-24 273 views
-1

我正在使用Selenium Web驅動程序,我認爲該體系結構是由Selenium IDE組件設計的,而對於其他事件則實現了核心java方法。 我目前面臨的主要問題是,我必須根據Internet的速度來設計我的腳本,並且大部分時間腳本因超時錯誤而崩潰。需要Thread.sleep()的替代解決方案;

爲了解決這個問題,我實現了「Thread.Sleep();」 java方法。 但是通過這個解決方案,系統自動化變得很慢,系統必須等到線程完成定時器。

所以,我需要一個優化的解決方案,像一個方法,它將持續進行下一步操作,直到整個頁面加載完畢。

+0

Mohit,您可以在WebDriver中找到地獄的同步數量。你可以用implicitWait和WebDriverWait來谷歌它。這兩個比Thread.Sleep更好。 – Uday 2014-11-24 13:12:22

+0

您好Uday,實際上我不想讓腳本執行預定義的時間量。相反,我正在研究一個解決方案,它將爲我提供如下功能: - 自動化腳本應該暫停,直到整個頁面和所有事件在該頁面被加載。如果可能,請提供解決此問題的方法。 – 2014-11-26 04:33:55

回答

0

而不是有一個大的Thread.Sleep,並希望下一個作品完成後就可以做好準備,可以將其分解爲若干次重試。

所以不是(僞代碼):

doSomething(); 
Thread.sleep(5000); 
doNextThing(); //Let's hope we're ready at this point... 

你可以這樣做:

doSomething(); 
for(int i=0; i < 5; i++) 
{ 
    if(isNextBitReady()) 
    { 
     break; //Yay! Give up sleeping and carry on 
    } 
    else 
    { 
     Thread.sleep(1000); //Sleep a little bit and try again 
    } 
} 
doNextThing(); 

這意味着你的等待時間有望是通常較短,但你仍然有一個安全網,如果特別運行緩慢。您可以平衡重試次數和睡眠時間,以獲得更細粒度的檢查。

+0

我想或多或少都是一樣的,唯一的_issue_是否有某種'isNextBitReady'方法可用? – munyul 2014-11-24 09:39:45

3

你也可以試試這個代碼,等待瀏覽器提供頁面是否加載。

objExecutor = (JavascriptExecutor) objDriver; 
if (!objExecutor.executeScript("return document.readyState").toString() 
    .equalsIgnoreCase("complete")){ 
    Thread.sleep(100); 
} 

你可以簡單地把它放在你的基本頁面,所以你不需要把它寫在每個pageobjects中。我從未嘗試過任何支持AJAX的網站,但這可能會幫助您和您的場景依賴關係也會消失。

我更喜歡使用Selenium的FluentWait API。通過使用它,您可以另外設置最大等待時間(.withTimeout),也可以忽略某些異常。

public void waitUntilDocumentIsReady() { 
    Wait<WebDriver> wait = new FluentWait<>(this.webDriver()) 
      .withTimeout(25, TimeUnit.SECONDS) 
      .pollingEvery(1, TimeUnit.SECONDS) 
      .ignoring(UnhandledAlertException.class); 

    wait.until(new Function<WebDriver, Boolean>() { 
     @Override 
     public Boolean apply(WebDriver f) { 
      return ((JavascriptExecutor) f).executeScript("return document.readyState").equals("complete"); 
     } 
    }); 
+0

@Stefan似乎更好的執行......感謝編輯... – 2014-11-24 14:42:04

1

硒文檔(selenium),你可以使用隱式等待:

WebDriver driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
driver.get("http://somedomain/url_that_delays_loading"); 
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement")); 

這會告訴司機等着,當你使用FluentWait搜索網頁上的元素,這一點尤其重要在失敗前最多10秒鐘,但它會自動循環查看結果是否準備就緒。如果準備就緒,則該方法繼續而不等待10秒。請不要指出整個硒腳本的值。