WatiN - Ожидание файлов cookie

Мне поручили создать «своего рода» паутину. Задачи заключаются в том, чтобы зайти на определенные веб-сайты, ввести часть данных, а затем отправить эти данные для получения результата.

Я обнаружил, что WatiN является отличным инструментом для получения этих данных, поскольку он имеет открытый исходный код и обладает всеми необходимыми мне функциями, даже если это неправильное использование API тестирования (это неправильное использование?).

Во всяком случае, настоящий вопрос заключается в том, что

Browser.WaitForComplete();

Не ждет, пока ВСЕ загрузится. Кажется, он просто ждет последнего тега body, а затем возвращается. Однако я считаю, что файл cookie не создается, когда страница завершает загрузку, поскольку она создается серверной частью ASP.NET - кажется, она загружается после интерактивного объекта, который выглядит как AJAX или что-то в этом роде.

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

Есть ли способ заставить WatiN ждать обновления файла cookie?

Заранее спасибо.

Джон.

Редактировать:

В качестве примера того, что я делаю, чтобы исправить проблему в минуту (что немного неортодоксально, но это решается в минуту).

Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();

var cookie = Browser.Eval("document.cookie");

Теперь вы можете понять, почему я хочу найти реальное решение.

Спасибо


person Johnathan. G    schedule 27.02.2011    source источник


Ответы (1)


Я не уверен, что смогу зафиксировать событие для этого, так как подозреваю, что на странице должен быть запущен javascript, который в конечном итоге обновляет файл cookie.

Если вы можете определить разницу между «старым» и «обновленным» файлом cookie, вы можете попробовать что-то вроде этого:

// Maximum number of loops, to avoid infinite loops
int maxLoops = 10;

// Wait for the page to complete
Browser.WaitForComplete();

// Grab a copy of the current cookie
var cookie = Browser.Eval("document.cookie");

// HACK: Dirty hack to wait for cookie to be updated
while (CookieIsNotUpdated(cookie) && i++ <= maxLoops)
{
    Browser.WaitForComplete(); // (Or other wait/sleep)
    cookie = Browser.Eval("document.cookie");
}

Это не очень хороший способ сделать это, но он должен работать в отсутствие чего-то лучшего.

person Danny Tuppeny    schedule 27.02.2011
comment
Действительно, это был один из способов, который у меня был изначально. Однако я обнаружил, что даже очистка файлов cookie перед загрузкой страницы была напрасной, поскольку страница, похоже, генерирует шаблон файла cookie, например: «cookieData=6&cookieData2=6», а затем, похоже, меняет их после создания файла cookie. 'cookieData=4&cookieData2=1' Я надеюсь, что есть более точные способы поблагодарить это. Спасибо за отзыв, но он очень ценен! - person Johnathan. G; 27.02.2011
comment
Если вы не можете определить, обновлен ли файл cookie, лучшее, что вы можете сделать, это решить, как долго вы готовы ждать, а затем подождать столько времени. Это не будет надежным, но я не вижу другого выхода. - person Danny Tuppeny; 27.02.2011
comment
Тем не менее, если вы копаетесь на странице, которую вы звоните, вы можете внедрить некоторый javascript и уведомить вас, когда это будет сделано, в зависимости от того, как это работает. - person Danny Tuppeny; 27.02.2011
comment
Как вы сказали. Внедрение Javascript — это решение, которое, я думаю, я буду изучать. Я уверен, что есть какая-то функция Javascript, чтобы сообщить мне, когда файл cookie был создан и когда он готов. - person Johnathan. G; 27.02.2011