2012-06-16 120 views
4

我想使用硒webdriver,junit和ant構建自動化測試用例。自上午以來我出現了奇怪的錯誤。測試用例包含按鈕單擊命令。測試在Chrome和FF上運行成功,但不在IE上運行。早些時候,它至少說,無法找到一些元素X,但這個說服務器沒有提供任何信息。IE的硒WebDriver錯誤

Testcase: testMethod took 10.342 sec 
    Caused an ERROR 
Cannot click on element (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 172 milliseconds 
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:04' 
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_33' 
Driver info: driver.version: RemoteWebDriver 
Session ID: 8dfc5072-2755-40a7-bb32-05708c51101f 
com.thoughtworks.selenium.SeleniumException: Cannot click on element (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 172 milliseconds 
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:04' 
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_33' 
Driver info: driver.version: RemoteWebDriver 
Session ID: 8dfc5072-2755-40a7-bb32-05708c51101f 
    at org.openqa.selenium.internal.seleniumemulation.SeleneseCommand.apply(SeleneseCommand.java:41) 
    at org.openqa.selenium.internal.seleniumemulation.Timer.run(Timer.java:38) 
    at org.openqa.selenium.WebDriverCommandProcessor.execute(WebDriverCommandProcessor.java:144) 
    at org.openqa.selenium.WebDriverCommandProcessor.doCommand(WebDriverCommandProcessor.java:74) 
    at com.thoughtworks.selenium.DefaultSelenium.click(DefaultSelenium.java:193) 
    at dmswebui.IE.TestLogin.testMethod(TestLogin.java:19) 
Caused by: org.openqa.selenium.ElementNotVisibleException: Cannot click on element (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 172 milliseconds 
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:04' 
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_33' 
Driver info: driver.version: RemoteWebDriver 
Session ID: 8dfc5072-2755-40a7-bb32-05708c51101f 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:458) 
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244) 
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:77) 
    at org.openqa.selenium.internal.seleniumemulation.Click.handleSeleneseCommand(Click.java:36) 
    at org.openqa.selenium.internal.seleniumemulation.Click.handleSeleneseCommand(Click.java:1) 
    at org.openqa.selenium.internal.seleniumemulation.SeleneseCommand.apply(SeleneseCommand.java:32) 
+1

提供一個示例頁面和示例代碼,您可以在其中重現此操作。同樣看WebDriverWait - 只是爲了確保它不是時間問題。 – Arran

回答

1

插入以下塊你火單擊事件

for (int second = 0;; second++) { 
    if (second >= 60) return "Page load failed"; 
    try { 
     if (session().isTextPresent("Logoff")) 
      break; 
    } 
    catch (Exception e) {} 
    Thread.sleep(1000); 
} 

在我的情況之前,我有一個測試用例超類,這就是爲什麼我能做到

session().somecommand 

但是,你可以翻譯我的解決方案融入你的。

4

我注意到異常

Caused by: org.openqa.selenium.ElementNotVisibleException: Cannot click on element 

此當你點擊該元素被遮擋或隱藏在頁面通常情況下。 WebDriver使用本地事件,因此無論何時您要求它對隱藏的WebElement執行操作都會失敗。

在Selenium RC中這不是問題,因爲它部署了合成事件(JS事件),並且可以模擬任何DOM元素的點擊,而不管其可見性如何。

+0

任何解決方案/解決方法? – riship89

+0

一般而言,您可以點擊頁面上的不可見元素。如果您認爲,點擊發生得太早,在元素可以自行披露之前,您應該等待元素在點擊之前變爲可見。使用標準的webdriver API沒有其他解決方法。 –

+0

你可以嘗試使用JavaScriptExecutor接口來執行一個使用JavaScript的點擊 - 這肯定會起作用,因爲你正在走出WebDriver沙箱並自己做事。這應該是你的最後手段。 –

2

在Internet Explorer中,至少在最近的版本10和前9版中,DOM無法完全重新加載或在WebDriver中單頁面應用程序或動態創建DOM的重度AJAX頁面中可見。我已經找到了解決辦法,現在是簡單地刷新頁面

driver.navigate().refresh();

我意識到這可能看起來像一個黑客,但它確實迫使IE瀏覽器重新加載頁面並繪製當前預期的DOM元素。即使插入WebDriverWait也沒有幫助(儘管這是最佳實踐,並且在使用ajax重型應用程序時應該在大多數情況下實施)。

根據我的經驗,我在一個Java項目和IE 10(進出compat模式)中使用最新的webdriver(2.31.0)版本。

一旦我弄清楚爲什麼IE會這樣做,我會將此答案更新爲更長期的便攜式解決方案,然後刷新頁面。現在,我繼續使用Chrome驅動程序並在IE中實施Chrome Frame。

0

在我的情況下,問題在於提交過程耗時過長,如超過兩分鐘,我的問題解決了在try catch上包裝點擊操作併爲該過程添加睡眠來完成,然後繼續。代碼如下

try { 
     button.click(); 
    } 
    catch (Exception e) 
{ 
    Thread.sleep(1000); 
}