2014-01-19 151 views
6

我正在創建一個測試並遇到一些問題。這是場景。我使用Selenium Web驅動程序填寫Page1上的表單並通過單擊按鈕提交表單。第2頁開始加載...但問題是,第2頁使用Google Analytics代碼,有時會導致頁面停止加載。使Selenium Webdriver停止加載頁面,如果所需的元素已被加載?

即使預期的元素已經存在,Selenium網絡驅動程序不會繼續,直到整個網頁完全加載。

如果預期的元素已經存在,我該如何讓Selenium移動到下一個任務或停止加載外部javascript/css?

我試着調整下面的設置,但沒有運氣。

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS); 
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

TEMPORARY SOLUTION:滾動下面的答案!

回答

4

給下面的方法一個鏡頭。

driver.findElement(By.tagName("body")).sendKeys("Keys.ESCAPE"); 

((JavascriptExecutor) driver).executeScript("return window.stop"); 

或者,也可以使用WebDriverBackedSelenium如從文森特布維爾下面的代碼段。

//When creating a new browser: 
WebDriver driver = _initBrowser(); //Just returns firefox WebDriver 
WebDriverBackedSelenium backedSelenuium = 
      new WebDriverBackedSelenium(driver,"about:blank");  

//This code has to be put where a TimeOut is detected 
//I use ExecutorService and Future<?> Object 

void onTimeOut() 
{ 
    backedSelenuium.runScript("window.stop();"); 
} 

來源:https://sqa.stackexchange.com/a/6355

來源:https://stackoverflow.com/a/13749867/330325

+0

我給它一個鏡頭,但同樣的問題仍然存在。無論我通過JavascriptExecutor還是WebDriver單擊按鈕,Page2都開始加載。但是由於Page2沒有完全加載,它會引發pagetimeout錯誤或不會移動到下一個語句(即檢查第2頁中是否存在預期的elm)。 Page2具有元素可訪問性,只是硒完全加載後才堅持繼續。 – roosevelt

+0

僅供參考,我也嘗試嘗試/趕上pagetimeout異常,看看我是否仍然可以執行selemium命令,但它不執行命令:( – roosevelt

0

檢查完的元素,你知道它存在,你既可以導航到/加載不同的頁面(如果下一個任務位於不同的頁面上),或者如果任務位於同一頁面上(因爲無論如何不需要尚未加載的元素),您可以像往常一樣繼續 - 硒將識別已加載的元素。當我使用功能豐富的頁面時,這適用於我。

0

而不是使用webdriver click()來提交表單使用jsexecutor並做一個單擊。 Jsexecutor不會等待頁面加載,您可以使用其他操作。

+0

我嘗試使用'((JavascriptExecutor)getDriver())。executeScript(「document .getElementById('btn-id')。click();「);'但是同樣的問題。Page2正在加載,Page2已經加載了這個項目,但由於頁面沒有完全加載完成,Selenium沒有執行下一個命令' getDriver()。findElement(By.id(「elm-waiting-for」))。isDisplayed()' – roosevelt

5

因此,我向Selenium彙報了這些問題。臨時的解決方法是...搞亂Firefox的超時設置。基本上默認情況下,Firefox在每次連接時都會等待大約250秒,然後再將其定時。你可以查看關於:config的細節。基本上我把它調低了,所以Firefox不會等太久,Selenium可以繼續下去,就好像頁面已經完成加載一樣:P。

其他瀏覽器也可能有類似的配置。我仍然認爲Selenium應該讓我們處理pagetimeout異常。確保你在這裏添加了一顆明星:http://code.google.com/p/selenium/issues/detail?id=6867&sort=-id&colspec=ID%20Stars%20Type%20Status%20Priority%20Milestone%20Owner%20Summary,所以硒修復了這些問題。

FirefoxBinary firefox = new FirefoxBinary(new File("/path/to/firefox.exe")); 
FirefoxProfile customProfile = new FirefoxProfile(); 
customProfile.setAcceptUntrustedCertificates(true); 
customProfile.setPreference("network.http.connection-timeout", 10); 
customProfile.setPreference("network.http.connection-retry-timeout", 10); 

driver = new FirefoxDriver(firefox, customProfile); 
driver.manage().deleteAllCookies(); 
-1

根據上述場景說明,我覺得最好在第一頁使用下面的等待命令。

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id(>someid>))); 

一旦在第一頁中找到所需的元素,您可以繼續進入第二頁。

-1

根據上述情況說明,我覺得最好在第一頁使用下面的等待命令。

WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = 
     wait.until(ExpectedConditions.presenceOfElementLocated(By.id(>someid>))); 

一旦在第一頁中找到了所需的元素,接下來就可以進入第二頁。

-2

使用顯式/ webdriver的等待----

WebDriverWait wt=new WebDriverWait(driver, 20); 
    wt.until(ExpectedConditions.elementToBeClickable(By.name("abc"))); 
+0

這個解決方案與問題無關。 – Vaibhav

相關問題