Перейти к содержимому

Фотография

Не виден код AJAX iframe


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 webimee

webimee

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Сергеев Иван

Отправлено 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

Спасибо
  • 0

#2 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 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
  • 1

#3 webimee

webimee

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Сергеев Иван

Отправлено 14 мая 2012 - 15:14

Скорее всего, код в iframe загружается постфактум (AJAX именно так и должен делать). Ctrl+U - это судя по всему просмотр исходного кода страницы, который включает то, что вернул сервер на запрос страницы и не учитывает никак отработавшие JS-вызовы (в том числе AJAX). А вот Firebug показывает структуру страницы как она есть сейчас, а не как она была получена изначально.

По поводу webdriver:

1) надо дождаться загрузки фрэйма
2) не забыть выполнить switchTo


new WebDriverWait(driver, 20);
С обычным таймером появляется неполный внутренний код. Подскажите, как можно дождаться загрузки этого iframe и получить ПОЛНЫЙ HTML-КОД?

P.S. Нашел статью, может нужно применить что-то оттуда?
  • 0

#4 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 15 мая 2012 - 08:20



Скорее всего, код в iframe загружается постфактум (AJAX именно так и должен делать). Ctrl+U - это судя по всему просмотр исходного кода страницы, который включает то, что вернул сервер на запрос страницы и не учитывает никак отработавшие JS-вызовы (в том числе AJAX). А вот Firebug показывает структуру страницы как она есть сейчас, а не как она была получена изначально.

По поводу webdriver:

1) надо дождаться загрузки фрэйма
2) не забыть выполнить switchTo


new WebDriverWait(driver, 20);
С обычным таймером появляется неполный внутренний код. Подскажите, как можно дождаться загрузки этого iframe и получить ПОЛНЫЙ HTML-КОД?

P.S. Нашел статью, может нужно применить что-то оттуда?


Насколько я понял, там обычные контролы, а не подгружающийся фрэйм.
Если он грузится действительно долго, можно попробовать ожидать readyState (frame.contentDocument.readyState). Но это поможет, если в самом фрэйме нет ajax. Если и там есть ajax, то работать в два этапа:

дождаться объекта фрэйма
затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью

Если и это по каким-то причинам невозможно, то остается только жесткий таймаут или колдовать с innerHTML фрэйма (ожидать, чтобы он не изменялся)
  • 0

#5 webimee

webimee

    Новый участник

  • Members
  • Pip
  • 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 секунд и наконец получил внутренности фрейма! :clapping:

затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью

Не поможете с реализацией этого кода?

Нашел такой пример:
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;

}

Наверное, лучше использовать бесконечный цикл?
  • 0

#6 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 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 секунд и наконец получил внутренности фрейма! :clapping:

затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью

Не поможете с реализацией этого кода?

Нашел такой пример:
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
  • 1

#7 webimee

webimee

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Сергеев Иван

Отправлено 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?
  • 0

#8 webimee

webimee

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Сергеев Иван

Отправлено 17 мая 2012 - 15:31

Нашел во время работы WebDriver во всех html тегах атрибут webdriver:
<html webdriver="true">
Что это такое?
Так сервер вычисляет, что это не человек, а WebDriver?
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных