В Watin, как ждать, пока сервер не обработает форму? - PullRequest
2 голосов
/ 22 сентября 2011

Я отправляю форму на свой сервер через JavaScript в виде, чтобы начать работу на стороне сервера.Представление обнаруживает, что задание завершено при вызове обратного вызова JavaScript.Точные детали взаимодействия JavaScript между сервером и клиентом должны выходить за рамки этой проблемы (я думаю), но дайте мне знать, если вам нужно больше деталей.Если это помогает, я использую библиотеку, похожую на Comet * SignalR , а не стандартную Ajax.

Теперь я хочу проверить это представление в Watin (2.1.0).Как я могу заставить Ватина дождаться окончания обработки серверной работы?Возможно, мне следует обновить атрибут в представлении, когда он обнаружит, что задание завершено?

1 Ответ

3 голосов
/ 22 сентября 2011

Зависит от того, как выглядит ваш js и html код.Это не так просто.Попробуйте использовать WaitUntil... методы.

Предположим, что после завершения задания появляются новые элементы div с идентификатором foo.Чтобы подождать, используйте этот код:

ie.Div("foo").WaitUntilExists();

Но иногда это не так просто.Допустим, что после выполнения задания содержимое таблицы меняется, т.е.старые строки удаляются, и появляются новые строки.Если так:

//Get cell reference
var cell = ie.Table("bar").OwnTableRow(Find.First()).OwnTableCell(Find.First());
var cellRef = cell.GetJavascriptElementReference();

//Change text of that cell using javascript. jQuery could be used if it's used on that page
//If you are 100% sure, that something will change, just assign cell.Text to text. If so, you don't even
//need cellRef
var text = "Dummy text or random or whatever";
ie.RunScript(cellRef + ".childNodes[0].nodeValue = '" + text + "'");

//TODO: 
//Do something here to fire ajax request

//Wait until table will be updated, ie. wait until first cell will not contains assigned dummy text.
//This could be done in many ways.
ie.Table("bar").WaitUntil(t => t.OwnTableRow(Find.First()).OwnTableCell(Find.First()).Text != text);
//or just:
//cell.WaitUntil(c => c.Text != text), but maybe it will not work in your case

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

...