Как обойти проблему ожидания
#1
Отправлено 16 марта 2008 - 13:17
#2
Отправлено 16 марта 2008 - 21:39
Например когда логинимся на сайт в Selenium RC как обойти проблему ожидания страницы.Т.е. сделать так чтобы дальше Selenium знал что страница загрузилась и дальше начал выполнять скрипт по сценарию?
А можно подробнее, в чем именно проблема? обычно происходит так:
1) Вводим логин, паоль, selenium.type(...)
2) Жмем Вход selenium.click(...)
3) Ждем пока новая страница загрузится ... selenium.waitForPageToLoad(...)
и идем дальше
с последним не всегда все просто но решаемо
#3
Отправлено 17 марта 2008 - 09:18
#4
Отправлено 17 марта 2008 - 09:23
Меня интересует другой вопрос. Часто на то, чтобы загрузить страницу стандартных 30 секунд не хватает, и тогда sel.open вылетает с таймаутом. Чтобы такого сделать, чтобы он ожидал загрузки дольше?
#5
Отправлено 17 марта 2008 - 09:34
Вообще-то, в принципе, значение такого таймаута задают из расчета на то, что больше этого времени страница не должна грузиться в принципе. Как правило, значение такого таймаута выносится в некоторую статическую переменную, которая инициализируется из некоторого конфигурационного файла ( это если в RC ), чтобы при переносе тестов на более медленную платформу достаточно было просто подправить в одном месте это значение.Я обычно делаю WaitForElementPresent или NotPresent для тех элементов, которые ожидаю к появлению, или которыые должны исчезнуть после загрузки страницы.
Меня интересует другой вопрос. Часто на то, чтобы загрузить страницу стандартных 30 секунд не хватает, и тогда sel.open вылетает с таймаутом. Чтобы такого сделать, чтобы он ожидал загрузки дольше?
В крайнем случае, если нехватает стандартного времени, то можно умножить это время на некоторый стандартный коефициент. Например, мы знаем, что некоторая страница грузится раза в 2 долше, чем остальные. Просто, если мы будем обходить ситуацию ,что страница не загрузилась в указанное время, то мы можем схлопотать бесконечный цикл в случае, если страница не загрузилась в принципе ( не найдена, например ).
#6
Отправлено 17 марта 2008 - 09:37
#7
Отправлено 17 марта 2008 - 09:38
Так ведь это оно и есть. waitForPageToLoad как раз и завершает выполнение, если страница полностью загрузилась или истек период ожидания. Период ожидания нужен для того, чтобы не происходило заклинивания в случае, если страница не найдена или просто где-то повисла загрузка (например серверный скрипт ушел в бесконечный цикл). Это просто пороговое время, дольше которого мы не ждемВ п.3 нужно указать время ожидания, мне же нужно, чтобы программа сама знала, что страница уже загрузила все элементы и идти дальше по сценарию, например так работает Watir.
#8
Отправлено 17 марта 2008 - 09:40
А, с Ajax это, конечно, не прокатит, так как перегружается не страница целиком, а только ее часть. В этом случае, как уже выше советовали, ожидайте появления некоторого элемента ,которого не было до этого. Это, пожалуй, наиболее универсальный способ убедиться, что какой-то сегмент страницы обновилсяЯ пишу на Python'e и там wait_for_page_to_load(self, timeout-милисекунды) - указывается время задержки.Но я тестю сложные аджаксовые веб-приложения и какую бы задержку не ставил все равно Selenium вылетает.
#9
Отправлено 17 марта 2008 - 09:41
В п.3 нужно указать время ожидания, мне же нужно, чтобы программа сама знала, что страница уже загрузила все элементы и идти дальше по сценарию, например так работает Watir.
Подход в духе waitForPageToLoad() + waitForCondition(){например waitForElementPresent()} пробовали?
#10
Отправлено 17 марта 2008 - 10:49
В п.3 нужно указать время ожидания, мне же нужно, чтобы программа сама знала, что страница уже загрузила все элементы и идти дальше по сценарию, например так работает Watir.
Подход в духе waitForPageToLoad() + waitForCondition(){например waitForElementPresent()} пробовали?
+1
Иногда также подойдет waitForElementNotPresent() + waitForElementPresent()
#11
Отправлено 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']"));
#12
Отправлено 18 марта 2008 - 12:12
В крайнем случае, если нехватает стандартного времени, то можно умножить это время на некоторый стандартный коефициент. Например, мы знаем, что некоторая страница грузится раза в 2 долше, чем остальные. Просто, если мы будем обходить ситуацию ,что страница не загрузилась в указанное время, то мы можем схлопотать бесконечный цикл в случае, если страница не загрузилась в принципе ( не найдена, например ).
[/quote]
А можно поподробней где находится этот конфигурационный файл и что именно нужно в нем править.
Зарание пасиба
#13
Отправлено 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
#14
Отправлено 21 марта 2008 - 18:53
while not sel.is_element_present(el):
try:
sel.wait_for_page_to_load(5000)
except:
pass
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных