Javascript: событие, когда выполняется манипуляция DOM - PullRequest
1 голос
/ 15 декабря 2010

У нас есть таблица, которая заполняется с помощью Ajax-вызова.В наших тестах Watin мы хотим проверить содержимое этой таблицы.Нам уже удалось выяснить, когда javascript, заполняющий таблицу, перестал работать, так что эта часть работает нормально.Тем не менее, в IE, похоже, существует задержка между моментом завершения заполнения JOM Javascript и моментом полного обновления DOM для Watin, чтобы обнаружить изменения.это работа, но мне это не нравится.Есть ли событие или что-то, чтобы поймать момент, когда DOM полностью обновляется?

РЕДАКТИРОВАТЬ: Пример кода

var tbody = $("#myID tbody");
tbody.empty();
$.each(item.Producten, function (i, item) {
    var row = "<tr><td>" + item.Property + "</td></tr>";
    tbody.append(row);
});

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

Я не думаю, что есть такое событие.Если бы это было так, WatiN использовал бы его.Но когда WatiN чего-то ждет, например.когда вы используете WaitUntil методы (иногда вы можете использовать его косвенно, например, при чтении свойства Exists), WatiN просто делает вызов Thread.Sleep в цикле (см. TryFuncUntilTimeOut class).

Почти все, что вам нужно, может быть достигнуто с помощью WaitUntil методов, но иногда это действительно сложно.Если бы я был вами, я бы попробовал немного больше с этим подходом (особенно если вы новичок в WatiN), но если бы это заняло слишком много времени, я бы просто использовал Thread.Sleep(500) и забыл об этом.

Я хотел бы добавить, что если есть возможность добавить некоторый код javascript для целей тестирования в конец вашего примера кода, вы можете установить какой-нибудь флаг, например loadingCompleted = 1, и использовать TryFuncUntilTimeOut (я могу 't запомните, есть ли подходящий WaitUntil метод), чтобы подождать, пока loadingCompleted не будет установлен в 1. Вы, конечно, можете использовать WatiN для чтения этой переменной - см. Document.Eval метод.

1 голос
/ 15 декабря 2010

Вы пробовали метод .WaitUntilExist?

РЕДАКТИРОВАТЬ: добавить пример кода

В вашем JS вы можете добавить класс:

var tbody = $("#myID tbody");
tbody.empty();
$.each(item.Producten, function (i, item) {
    var row = "<tr class='newRow'><td>" + item.Property + "</td></tr>";
    tbody.append(row);
});

В WatiN стороне:

Table table = Browser.Table("myID");
table.OwnTableRow(Find.ByClass("newRow")).WaitUntilExists();

Примечания:

  • Если ваша таблица пуста, вы можете использовать Find.Any в ограничениях
  • Если Find.ByClass не работает(Я знаю, что это имеет некоторые проблемы), используйте другое конкретное ограничение: Find.ByIndex, Find.ById и т. Д.
0 голосов
/ 16 декабря 2010

Это ответ в том же ключе, что предлагает простыник.

Почему бы не дать tbody такой атрибут, как data-uniqueId, и указывать это значение каждый раз в конце вашего кода JavaScript.Это может быть так же просто, как быть текущим временем и датой, если оно отличается от предыдущих значений.

Теперь, когда у вас есть этот атрибут и значение, вы можете использовать его в WatiN:

var currentUniqueId = browser.Table("myID").TableBody.GetAttributeValue("data-uniqueId");
.... do something to trigger the AJAX call

browser.Table("myID").TableBody.WaitUntil(!Find.By("data-uniqueId", currentUniqueId);

В первой строке мы получаем значение для data-uniqueId.В последней строке WatiN ожидает, пока не будет tbody с этим атрибутом, имеющим это значение (потому что значение data-uniqueId было изменено вашим кодом javascript).Теперь мы можем продолжить.

HTH, Jeroen

...