Не виден код AJAX iframe
#1
Отправлено 12 мая 2012 - 15:21
Я начал осваивать функции Selenium WeDriver 2 и столкнулся с проблемой:
у меня есть динамически загружаемый AJAX iframe, код которого мне необходимо протестировать.
Работаю с Firefox, загружаю необходимую страницу. Когда захожу посмотреть исходный код через Ctrl+U, iframe не имеет внутренностей!
scr1.jpg 50,43К 30 Количество загрузок:
Устанавливаю плагин Firebug, который позволяет смотреть код как в хроме, и в нем почему-то отображаются внутренности данного iframe:
scr2.jpg 51,01К 26 Количество загрузок:
WebDriver тоже не видит внутренности.
Кто знает, что нужно делать?
Использую Selenium WebDriver 2.21 + JUnit 4 + Eclipse
Спасибо
#2
Отправлено 14 мая 2012 - 08:14
Здравствуйте, уважаемые форумчане!
Я начал осваивать функции Selenium WeDriver 2 и столкнулся с проблемой:
у меня есть динамически загружаемый AJAX iframe, код которого мне необходимо протестировать.
Работаю с Firefox, загружаю необходимую страницу. Когда захожу посмотреть исходный код через Ctrl+U, iframe не имеет внутренностей!
scr1.jpg 50,43К 30 Количество загрузок:
Устанавливаю плагин Firebug, который позволяет смотреть код как в хроме, и в нем почему-то отображаются внутренности данного iframe:
scr2.jpg 51,01К 26 Количество загрузок:
WebDriver тоже не видит внутренности.
Кто знает, что нужно делать?
Использую Selenium WebDriver 2.21 + JUnit 4 + Eclipse
Спасибо
Скорее всего, код в iframe загружается постфактум (AJAX именно так и должен делать). Ctrl+U - это судя по всему просмотр исходного кода страницы, который включает то, что вернул сервер на запрос страницы и не учитывает никак отработавшие JS-вызовы (в том числе AJAX). А вот Firebug показывает структуру страницы как она есть сейчас, а не как она была получена изначально.
По поводу webdriver:
1) надо дождаться загрузки фрэйма
2) не забыть выполнить switchTo
#3
Отправлено 14 мая 2012 - 15:14
Скорее всего, код в iframe загружается постфактум (AJAX именно так и должен делать). Ctrl+U - это судя по всему просмотр исходного кода страницы, который включает то, что вернул сервер на запрос страницы и не учитывает никак отработавшие JS-вызовы (в том числе AJAX). А вот Firebug показывает структуру страницы как она есть сейчас, а не как она была получена изначально.
По поводу webdriver:
1) надо дождаться загрузки фрэйма
2) не забыть выполнить switchTo
new WebDriverWait(driver, 20);С обычным таймером появляется неполный внутренний код. Подскажите, как можно дождаться загрузки этого iframe и получить ПОЛНЫЙ HTML-КОД?
P.S. Нашел статью, может нужно применить что-то оттуда?
#4
Отправлено 15 мая 2012 - 08:20
Скорее всего, код в iframe загружается постфактум (AJAX именно так и должен делать). Ctrl+U - это судя по всему просмотр исходного кода страницы, который включает то, что вернул сервер на запрос страницы и не учитывает никак отработавшие JS-вызовы (в том числе AJAX). А вот Firebug показывает структуру страницы как она есть сейчас, а не как она была получена изначально.
По поводу webdriver:
1) надо дождаться загрузки фрэйма
2) не забыть выполнить switchTonew WebDriverWait(driver, 20);С обычным таймером появляется неполный внутренний код. Подскажите, как можно дождаться загрузки этого iframe и получить ПОЛНЫЙ HTML-КОД?
P.S. Нашел статью, может нужно применить что-то оттуда?
Насколько я понял, там обычные контролы, а не подгружающийся фрэйм.
Если он грузится действительно долго, можно попробовать ожидать readyState (frame.contentDocument.readyState). Но это поможет, если в самом фрэйме нет ajax. Если и там есть ajax, то работать в два этапа:
дождаться объекта фрэйма
затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Если и это по каким-то причинам невозможно, то остается только жесткий таймаут или колдовать с innerHTML фрэйма (ожидать, чтобы он не изменялся)
#5
Отправлено 15 мая 2012 - 11:49
Насколько я понял, там обычные контролы, а не подгружающийся фрэйм.
Если он грузится действительно долго, можно попробовать ожидать readyState (frame.contentDocument.readyState). Но это поможет, если в самом фрэйме нет ajax. Если и там есть ajax, то работать в два этапа:
дождаться объекта фрэйма
затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Если и это по каким-то причинам невозможно, то остается только жесткий таймаут или колдовать с innerHTML фрэйма (ожидать, чтобы он не изменялся)
try { Thread.sleep(n); } catch (InterruptedException e) { e.printStackTrace(); } driver.switchTo().frame(0);Знаете, я просто использовал этот таймер, который ждет n секунд и наконец получил внутренности фрейма!
Не поможете с реализацией этого кода?затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Нашел такой пример:
private WebElement foundElement; public WebElement find(By by){ for (int milis=0; milis<3000; milis = milis+200){ try{ foundElement = driver.findElement(by); }catch (Exception e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } return foundElement; }
Наверное, лучше использовать бесконечный цикл?
#6
Отправлено 16 мая 2012 - 09:12
Насколько я понял, там обычные контролы, а не подгружающийся фрэйм.
Если он грузится действительно долго, можно попробовать ожидать readyState (frame.contentDocument.readyState). Но это поможет, если в самом фрэйме нет ajax. Если и там есть ajax, то работать в два этапа:
дождаться объекта фрэйма
затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Если и это по каким-то причинам невозможно, то остается только жесткий таймаут или колдовать с innerHTML фрэйма (ожидать, чтобы он не изменялся)try { Thread.sleep(n); } catch (InterruptedException e) { e.printStackTrace(); } driver.switchTo().frame(0);Знаете, я просто использовал этот таймер, который ждет n секунд и наконец получил внутренности фрейма!Не поможете с реализацией этого кода?затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Нашел такой пример:private WebElement foundElement; public WebElement find(By by){ for (int milis=0; milis<3000; milis = milis+200){ try{ foundElement = driver.findElement(by); }catch (Exception e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } return foundElement; }
Наверное, лучше использовать бесконечный цикл?
Для реализации ожидания элемента необходимо использовать WbeDriverWait или implicityWait. Подробнее посмотрите по ссылке: http://seleniumhq.or...r_advanced.html
#7
Отправлено 17 мая 2012 - 09:21
Для реализации ожидания элемента необходимо использовать WbeDriverWait или implicityWait. Подробнее посмотрите по ссылке: http://seleniumhq.or...r_advanced.html
Я уже пробовал использовать WebDriverWait. Проблема была в том, что я не переключался в данный фрейм и поэтому WebDriver не мог найти элементы в нем. Теперь же WebDriverWait работает исправно, я поместил его в отдельной функции:
public static void waitForElement (final By by, int s, WebDriver d) { new WebDriverWait(d, s).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { return d.findElement(by) != null; } }); }
driver.switchTo().frame("iFrame"); waitForElement( );
Огромное Вам спасибо!
P.S. А чем отличается WebDriverWait от implicityWait?
#8
Отправлено 17 мая 2012 - 15:31
<html webdriver="true">Что это такое?
Так сервер вычисляет, что это не человек, а WebDriver?
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных