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

Фотография

Как обойти проблему ожидания


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

#1 Gnomik

Gnomik

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Попов Федор Иванович

Отправлено 16 марта 2008 - 13:17

Например когда логинимся на сайт в Selenium RC как обойти проблему ожидания страницы.Т.е. сделать так чтобы дальше Selenium знал что страница загрузилась и дальше начал выполнять скрипт по сценарию?
  • 0

#2 anon

anon

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • ФИО:Stas Seliverstov

Отправлено 16 марта 2008 - 21:39

Например когда логинимся на сайт в Selenium RC как обойти проблему ожидания страницы.Т.е. сделать так чтобы дальше Selenium знал что страница загрузилась и дальше начал выполнять скрипт по сценарию?


А можно подробнее, в чем именно проблема? обычно происходит так:

1) Вводим логин, паоль, selenium.type(...)
2) Жмем Вход selenium.click(...)
3) Ждем пока новая страница загрузится ... selenium.waitForPageToLoad(...)
и идем дальше

с последним не всегда все просто но решаемо
  • 0

#3 Gnomik

Gnomik

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Попов Федор Иванович

Отправлено 17 марта 2008 - 09:18

В п.3 нужно указать время ожидания, мне же нужно, чтобы программа сама знала, что страница уже загрузила все элементы и идти дальше по сценарию, например так работает Watir.
  • 0

#4 Shelty

Shelty

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

  • Members
  • Pip
  • 15 сообщений

Отправлено 17 марта 2008 - 09:23

Я обычно делаю WaitForElementPresent или NotPresent для тех элементов, которые ожидаю к появлению, или которыые должны исчезнуть после загрузки страницы.

Меня интересует другой вопрос. Часто на то, чтобы загрузить страницу стандартных 30 секунд не хватает, и тогда sel.open вылетает с таймаутом. Чтобы такого сделать, чтобы он ожидал загрузки дольше?
  • 0

#5 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 марта 2008 - 09:34

Я обычно делаю WaitForElementPresent или NotPresent для тех элементов, которые ожидаю к появлению, или которыые должны исчезнуть после загрузки страницы.

Меня интересует другой вопрос. Часто на то, чтобы загрузить страницу стандартных 30 секунд не хватает, и тогда sel.open вылетает с таймаутом. Чтобы такого сделать, чтобы он ожидал загрузки дольше?

Вообще-то, в принципе, значение такого таймаута задают из расчета на то, что больше этого времени страница не должна грузиться в принципе. Как правило, значение такого таймаута выносится в некоторую статическую переменную, которая инициализируется из некоторого конфигурационного файла ( это если в RC ), чтобы при переносе тестов на более медленную платформу достаточно было просто подправить в одном месте это значение.

В крайнем случае, если нехватает стандартного времени, то можно умножить это время на некоторый стандартный коефициент. Например, мы знаем, что некоторая страница грузится раза в 2 долше, чем остальные. Просто, если мы будем обходить ситуацию ,что страница не загрузилась в указанное время, то мы можем схлопотать бесконечный цикл в случае, если страница не загрузилась в принципе ( не найдена, например ).
  • 0

#6 Gnomik

Gnomik

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Попов Федор Иванович

Отправлено 17 марта 2008 - 09:37

Я пишу на Python'e и там wait_for_page_to_load(self, timeout-милисекунды) - указывается время задержки.Но я тестю сложные аджаксовые веб-приложения и какую бы задержку не ставил все равно Selenium вылетает.
  • 0

#7 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 марта 2008 - 09:38

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

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

#8 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 марта 2008 - 09:40

Я пишу на Python'e и там wait_for_page_to_load(self, timeout-милисекунды) - указывается время задержки.Но я тестю сложные аджаксовые веб-приложения и какую бы задержку не ставил все равно Selenium вылетает.

А, с Ajax это, конечно, не прокатит, так как перегружается не страница целиком, а только ее часть. В этом случае, как уже выше советовали, ожидайте появления некоторого элемента ,которого не было до этого. Это, пожалуй, наиболее универсальный способ убедиться, что какой-то сегмент страницы обновился
  • 0

#9 NLord

NLord

    Активный участник

  • Members
  • PipPip
  • 108 сообщений

Отправлено 17 марта 2008 - 09:41

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


Подход в духе waitForPageToLoad() + waitForCondition(){например waitForElementPresent()} пробовали?
  • 0

#10 kbar

kbar

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

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Барзаковский Константин Владимирович

Отправлено 17 марта 2008 - 10:49

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


Подход в духе waitForPageToLoad() + waitForCondition(){например waitForElementPresent()} пробовали?


+1
Иногда также подойдет waitForElementNotPresent() + waitForElementPresent()
  • 0

#11 anon

anon

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • ФИО:Stas Seliverstov

Отправлено 17 марта 2008 - 11:05

Например когда логинимся на сайт в Selenium RC как обойти проблему ожидания страницы.Т.е. сделать так чтобы дальше Selenium знал что страница загрузилась и дальше начал выполнять скрипт по сценарию?


waitForPageToLoad() не работает для Pop-Up окон, а так же ведет себя очень плохо
в случае редиректа.

Как и советовали надо просто проверять наличие элемента isElementPresent(); -
только не забывать двавать время на загрузку элемента

Либо через waitForCondition()

selenium.open("http://www.google.com");
selenium.click("link=Новости");
selenium.waitForCondition("var element;" +
				"try {element = selenium.browserbot.findElement('xpath=//a[@href=\\\'/news?ned=es_co\\\']');}" +
				"catch(e){element=null;}" +
				"element != null", "30000");
System.out.println(selenium.getText("xpath=//a[@href='/news?ned=es_co']"));

  • 0

#12 Jolly

Jolly

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

  • Members
  • Pip
  • 42 сообщений
  • ФИО:Олег
  • Город:Днепропетровск

Отправлено 18 марта 2008 - 12:12

Вообще-то, в принципе, значение такого таймаута задают из расчета на то, что больше этого времени страница не должна грузиться в принципе. Как правило, значение такого таймаута выносится в некоторую статическую переменную, которая инициализируется из некоторого конфигурационного файла ( это если в RC ), чтобы при переносе тестов на более медленную платформу достаточно было просто подправить в одном месте это значение.

В крайнем случае, если нехватает стандартного времени, то можно умножить это время на некоторый стандартный коефициент. Например, мы знаем, что некоторая страница грузится раза в 2 долше, чем остальные. Просто, если мы будем обходить ситуацию ,что страница не загрузилась в указанное время, то мы можем схлопотать бесконечный цикл в случае, если страница не загрузилась в принципе ( не найдена, например ).
[/quote]


А можно поподробней где находится этот конфигурационный файл и что именно нужно в нем править.
Зарание пасиба
  • 0

#13 NLord

NLord

    Активный участник

  • Members
  • PipPip
  • 108 сообщений

Отправлено 18 марта 2008 - 12:43

А можно поподробней где находится этот конфигурационный файл и что именно нужно в нем править.
Зарание пасиба


Этот файл создаёте и используете Вы сами. В случае Java это какой либо *.properties file в котором лежит что-то в духе
tests.delays.initialload=500000

Пример использования:
Это стандартный джавовский файл свойств, соответственно


public abstract class AbstractTest {
...
static {
Properties config = new Properties();
InputStream defaultIs = AbstractTest.class.getResourceAsStream("/default.properties");

if (defaultIs == null) {
throw new IllegalStateException("Can't read config file");
}

try {
config.load(defaultIs);
} catch (IOException e) {
throw new IllegalStateException("Can't load configuration properties.", e);
} finally {
IOUtils.closeQuietly(defaultIs);
}
...

theDelay = config.getProperty("tests.delays.initialload");
...
}

}


В C# это тоже файлы ресурсов, схема использования таже, на msdn поищите resource file. Глобальная разница только в использовании статического конструктора, а не блока static как в Яве.

Сообщение отредактировал NLord: 18 марта 2008 - 12:55

  • 0

#14 Gnomik

Gnomik

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Попов Федор Иванович

Отправлено 21 марта 2008 - 18:53

Обошел проблему циклом
while not sel.is_element_present(el):
try:
sel.wait_for_page_to_load(5000)
except:
pass
  • 0


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

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