2012-06-16 3 views
4

Я пытаюсь автоматизировать тестовые примеры с использованием селен-webdriver, junit и ant build. С утра я получаю странные ошибки. В тестовом примере содержится команда нажатия кнопки. Тест проходит успешно в Chrome и FF, но не в IE. Раньше он, по крайней мере, говорил, что не может найти элемент X, но это говорит о том, что сервер не предоставил никакой информации.Ошибка Selenium WebDriver для IE

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

В общем, вы можете нажать на невидимые элементы на странице. Если вы думаете, что щелчок произошел слишком рано, прежде чем элемент сможет раскрыть себя, вы должны дождаться, пока элемент станет видимым, прежде чем нажимать. Другого пути нет, используя стандартные API webdriver. –

+0

Вы можете попробовать интерфейс JavascriptExecutor, чтобы выполнить щелчок с помощью JavaScript - это определенно сработает, поскольку вы выходите из песочницы WebDriver и сами делаете. Это должно быть вашим последним прибежищем. –

2

В Internet Explorer, по крайней мере, в последней версии 10 и предыдущих 9, DOM не может полностью перезагрузиться или быть видимым WebDriver в одностраничных приложениях или тяжелых страницах ajax, где DOM динамически создается. Я нашел обходной путь, на данный момент является просто обновить страницу

driver.navigate().refresh();

Я понимаю, что это может показаться, как взломать, но это не заставит браузер IE, чтобы перезагрузить страницу и сделать текущие ожидаемые элементы DOM. Даже вставка WebDriverWait не помогла (хотя это лучшая практика и должна быть реализована в большинстве случаев при работе с тяжелыми приложениями ajax).

Во время моего опыта я использовал последнюю версию webdriver (2.31.0) в проекте Java и IE 10 (в режиме и из режима совместимости).

Как только я выясню, почему IE делает это, я обновлю этот ответ на более длинное переносное решение, а затем просто обновляю страницу. На данный момент я перешел к использованию Chrome Driver и внедрил Chrome Frame в IE.

0

В моем случае проблема заключалась в том, что процесс отправки занимал слишком много времени, например, более двух минут, и моя проблема была решена, чтобы завершить операцию щелчка на попытке уловить и добавить спать для завершения процесса, а затем продолжить. Код следующим образом

try { 
     button.click(); 
    } 
    catch (Exception e) 
{ 
    Thread.sleep(1000); 
} 
Смежные вопросы