2011-08-31 2 views
1

SeleniumServer: 2.5.0, Firefox версия: 4.0.1Селен: Firefox с WebDriver: Страница проблема загрузки версия

У меня есть ситуации, когда гиперссылкой «новый вопрос» визуализируется с помощью вызова Ajax. Когда загрузка страницы будет завершена, мне нужно нажать на эту гиперссылку, чтобы продолжить. Я использую что-то вроде ниже, чтобы подождать, пока ссылка не появится, и нажмите на нее.

while (!(driver.findElement(By.xpath("//a[text()='New Question']")).isEnabled())) { 
      Thread.sleep(1000); 
} 
driver.findElement(By.xpath("//a[text()='New Question']")).click(); 

Это работает как очарование в IE. Но в Firefox ссылка не нажата.

Это говорит о том, что Firefox сообщает Selenium, что страница загружается, когда она не загружена полностью, где IE работает правильно.

Чтобы проверить, действительно ли происходит щелчок, я помещаю javascript: alert("Hello From Chandra"); в гиперссылку onclick. Всплывающее окно появилось на IE, но не на Firefox.

Вопрос: Я делаю что-то неправильно/неадекватно? Есть ли обходной путь?

Спасибо. PS: Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

+0

Вы пробовали это с помощью WebDriverWait? – prestomanifesto

+0

Вы пытались использовать isDisplayed() вместо isEnabled()? вы также можете попробовать таким образом: while (! (driver.findElement (By.xpath ("// a [text() = 'New Question']")). isDisplayed())) { Thread.sleep (1000) ; } –

ответ

3

Вам не нужен цикл while, вы можете использовать implicitlyWait при инициализации драйвера. Это заставит драйвер опросить наличие элемента за 90 секунд, прежде чем выбрасывать исключение элемента.

driver.manage().timeouts().implicitlyWait(90, TimeUnit.SECONDS); 
driver.findElement(By.xpath("//a[text()='New Question']")).click(); 
+0

Да, я думаю, он должен работать –

0

Благодаря Nilesh и prestomanifesto, но я пытался «WebDriverWait» и «implicitlyWait», прежде чем положить в то время цикла (который не работал, а), и это не сработало. Я немного поработал и, похоже, нашел решение следующим образом. Существует текстовое поле «поиск», которое получает фокус после завершения загрузки страницы. Я использовал «activeElement», чтобы проверить, действительно ли фокус установлен.

while (!driver.findElement(By.id("searchValue")).isEnabled()) { 
      WebElement currActiveElement = driver.switchTo().activeElement(); 
      if (currActiveElement.getAttribute("id").equals("searchValue")) { 
       break; 
      } 
      Thread.sleep(1000); 
     } 
0

Вы можете все еще ускорив выполнение Вашего сценария, ожидая присутствия (не дожидаясь видимости, IsEnabled) ожидаемого элемента для скажем 5-8 с, а затем отправить window.stop() JS скрипт (чтобы остановить загрузку дальше элементы), не дожидаясь, пока вся страница загрузится или поймает исключение таймаута для загрузки страницы через 5-8 секунд, после чего вызовет window.stop()

Потому что, если страница не принята ленивой техникой загрузки (загрузка только видимого элемента и загрузка остатка элемента только после прокрутки) он загружает каждый элемент перед возвратом состояния window.ready, поэтому он будет медленнее, если какой-либо элемент занимает больше времени для рендеринга.

Смежные вопросы