2014-05-09 2 views
1

После прочтения Dianyang Wu article и this отличный пост мне удалось построить небольшой .net приложение (почти C & P из исходного кода Wu) автоматизировать тесты (давайте назовем его protoTestApp). Моя конечная цель - открыть дюжину маленьких окон и в каждом имитировать другого пользователя, взаимодействующего с веб-приложением, чтобы подчеркнуть его.WebBrowserDocumentCompletedEventHandler Не ждите Ajax Асинхронный завершить

Он работает в некоторой степени, но после входа в веб-приложение (назовем его InternalTestSubject) он вызывает внешний url (назовем его ExternalTestSubject) и вводит его содержимое в iFrame. Этот конкретный внешний URL-адрес является другим веб-приложением, и он не обращает внимания на родительское окно, чтобы получить некоторые параметры. Открытие ExternalTestSubject напрямую не является вариантом.

Моя проблема заключается в моем protoTestApp. Я хочу также взаимодействовать с этим ExternalTestSubject (найти кнопку по id, щелкнуть ее и т. Д.), Но у моего обработчика CompletedEvent iFrame по-прежнему пуст.

WebBrowser показывает как загруженные, так и рабочие веб-приложения, поэтому я предполагаю, что обработчик просто не дожидается загрузки iFrame, так как это выполняется асинхронным вызовом Ajax.

Любые советы по его усвоению?

+0

Как начать действие iFrame? это какой-то JavaScript, который запускает событие onload, которое AJAX вызывает ответ инъекций в iFrame? – LB2

+0

InternalTestSubject - это веб-приложение .net MVC. iFrame динамически генерируется связанным index.js в готовом событии и добавляется к div, объявленному в index.cshtml. iFrame указывает на URL-адрес ExternalTestSubject. До сих пор мой WebBrowserDocumentCompletedEventHandler вызывается дважды (после первого вызова на странице входа), и в обоих я вижу пустой iFrame, я полагаю, обработчик не ждет, чтобы документ iFrame загрузил – jean

+0

_ «Я вижу пустое iFrame "_ как визуально, либо при попытке получить доступ к его свойствам окна/DOM? Там, где я собираюсь, я задаюсь вопросом, имеете ли вы ограничения в отношении того же самого происхождения, что и для iFrames. – LB2

ответ

0

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

Вкратце: использование рамки для загрузки внешнего материала и проведения тестирования не является хорошим подходом. Даже если вы используете таймер для проверки состояния загрузки вручную. Но в соответствии с соображениями безопасности у вас будет много проблем с доступом к DOM.

У меня есть два предложения для вас:

  1. Создать WebBrowser экземпляр и открыть внешний тест предмет в него. У вас будет очень хороший шанс узнать, полностью ли загружен документ (и его фреймы). У вас все еще есть полный контроль доступа к любым элементам WebBrowser или элементам cookie или щелчкам или изменению элементов.

  2. Использовать 3-й инструмент, такой как Selenium в качестве тестового драйвера.


Update 1:

Как спрашивающий не хочет каких-либо 3-ий инструмент, я хотел бы предложить его внутренние испытуемый запрос, погрузочной полноту целевого кадра периодически. Возможный код можно проверить document.readyState == 'complete'.

Насколько я знаю, поскольку внешний объект теста встроен в кадр, из-за соображений безопасности вы не сможете получить доступ к DOM кадра. Другими словами, вы не можете делать щелчки мыши и т. Д., Если сначала не изменить параметры безопасности для элемента управления Webbrowser.

+0

Вопрос о том, что открытие внешнего тестового объекта не является вариантом, поскольку он плохо работает должным образом из внутреннего объекта теста. Думайте как о аквариуме, так и о рыбе. Также попытался сделать это динамически, найдя iFrame и «прикрепляя» его к новому WebBrowser и не работал (созданный экземпляр не запускает события). Покупка стороннего инструмента здесь не вариант. – jean

+0

@jean Я установил обновление, пожалуйста, проверьте. Но я сомневаюсь, что подход не сработает. BTW: Селен свободен. – stanleyxu2005

1

Я думаю, что объяснил это в the answer, вы связались (и более подробно в another related answer). Страницы AJAX не являются детерминированными, поэтому нет общего подхода.

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

+0

Прежде чем отправлять этот вопрос, я немного поиграл с исходным кодом, который вы дадите в github (хороший фрагмент кода кстати). Использование вашего консольного решения дает мне такие же результаты: пустой iFrame. Btw в WebBrowserDocumentCompletedEventHandler isBusy всегда является ложным, и я должен выяснить, как использовать что-то вроде этой задачи/ждать в консольном решении – jean

+0

@jean, я имел в виду, что после моделирования клика вам нужно продолжать опрос содержимого DOM 'iframe', используя метод' Task.Delay', как в этом коде (или таймере), в случае, если 'WebBrowserDocumentCompletedEventHandler' не дает вам то, что вам нужно. – Noseratio

+0

Позор, неудивительно, что я потерпел неудачу. Теперь я вижу, что я понимаю ваш код еще меньше, я догадывался. В следующий раз я буду больше стараться. Может быть, мне удастся поместить этот проект github в этот сценарий – jean

Смежные вопросы