Как заставить WatiN сканировать динамически загружаемый контент? - PullRequest
1 голос
/ 02 сентября 2011

Ситуация такова, что у меня есть страница, которая использует некоторые вызовы AJAX для извлечения контента с сервера, а затем помещает эти результаты в кусок html, созданный другим скриптом.Проблема в том, что я не могу выбрать с помощью watin ни один из элементов этого нового фрагмента HTML.Его можно просмотреть в браузере, и он появляется, когда я нажимаю клавишу F12 и сканирую код, но WatiN все равно его не видит.

Это потому, что WatiN сканирует только HTML-источник страницы,а не текущая версия HTML?Я думаю, что похожая ситуация была бы:

html -

<script type="text/javascript">
    $('#foo').html("gak");
</script>
...
<div id="foo">bar</div>

, тогда, когда я попытаюсь утверждать -

Assert.IsTrue(browser.Div("foo")).ContainsText("gak"));

, он вернет false.

Есть идеи по этому поводу?или мой лучший вариант просто написать кучу jQuery и browser.Eval () это?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Это почти наверняка проблема синхронизации . При тестировании jQuery не обновлялся. Вместо того, чтобы вводить искусственную паузу или ждать, лучше подождать, пока что-нибудь покажет, что ваш AJAX работает должным образом.

В этом случае WaitUntil должен хорошо выполнить свою работу:

Assert.IsTrue(browser.Div("foo")).WaitUntil(c => c.Text.Contains("gak")));

Это работает для большинства обновлений и тому подобного. Еще одна распространенная схема ожидания - при загрузке данных, скажем, там, где отображается вращающееся колесо. Тогда вы можете подождать, пока это колесо не исчезнет с чем-то вроде:

WaitUntil(c => c.Style.Display == "none");
2 голосов
/ 02 сентября 2011

Я немного тестирую страницы AJAX. Ключ заключается в том, чтобы дождаться завершения обратной передачи asnyc. Если у вас есть

Assert.IsFalse(browser.Div("foo")).ContainsText("gak");
browser_action_that_changes_bar_to_gak
>> Here you need to wait <<
Assert.IsTrue(browser.Div("foo")).ContainsText("gak");

В разделе «ожидания» вы можете выполнить System.Threading.Thread.Sleep (numberOfMilliseconds) <- это <strong>не лучший способ , но это действительно просто. Как только вы определили, что ожидание - это то, что вам нужно, лучший способ подождать - опрашивать статус, а не каждый раз набирать numberOfMilliseconds . Я полагаю, что разные библиотеки AJAX делают вещи по-разному, но для меня работает действительно подобно этому: http://pushpontech.blogspot.com/2008/04/ajax-issues-with-watin.html

Я поместил JavaScript в Eval () во вспомогательную функцию в классе моей базовой страницы, а не вставлял его в каждую страницу, как в статье.

.

класс моей Базовой страницы содержит:

public bool IsInAsyncPostBack()
{
    const string isAsyncPostBackScript = "Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()";
    return bool.Parse(this.Document.Eval(isAsyncPostBackScript));
}

И тогда мой WaitForAsyncPostback в основном такой же, как в связанном посте, но я добавил максимальное время ожидания. Прежде чем перейти к классам Page (классно; сделайте это!), Я сделал эти статические функции где-то еще, и это тоже сработало.

...