WatiN Периодические сбои - PullRequest
1 голос
/ 03 ноября 2011

У моей команды есть набор тестовых наборов WatiN, которые автоматически запускаются нашим сервером TeamCity. Недавно мы переключили все наши агенты сборки на 64-битные, и я также переключил наши тесты WatiN на использование NUnit в режиме x64. Watin всегда давал нам нечастые тестовые сбои из-за неудачных вызовов Interop в браузер IE или по другим причинам, но они всегда были довольно редкими. Поскольку все переключается на 64-разрядную версию, почти каждый запуск любого из наших тестовых наборов дает сбой со следующим исключением:

Test(s) failed. System.InvalidCastException : Specified cast is not valid.
    at SHDocVw.IWebBrowser2.get_HWND()
    at WatiN.Core.Native.InternetExplorer.IEBrowser.get_hWnd()
    at WatiN.Core.DomContainer.StartDialogWatcher()
    at WatiN.Core.IE.CreateNewIEAndGoToUri(Uri uri, IDialogHandler logonDialogHandler, Boolean createInNewProcess)
    ...

Я нашел связанный вопрос , где пользователь WatiN видит то же исключение, но это потому, что он пытается многопоточность. Мы не делаем ничего подобного, на самом деле мы используем правильную квартиру состояния потока, как это предлагается в документации WatiN. Я заметил в этом вопросе, что кто-то прокомментировал, что это может быть из-за режима x86 или x64.

Как можно избежать этой ошибки, приводящей к частым ошибкам моих тестов?

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

UPDATE:
Оставив задания с использованием 64-битного NUnit runner для более 5 запусков тестовых наборов, они каждый раз терпели неудачу, за исключением одного раза с этой же ошибкой. Мы переключили их обратно на 32 бит и с тех пор провели более 10 успешных запусков. Я полагаю, что временное исправление - это использование 32-битного NUnit-бегуна, хотя я все еще ищу причину, по которой это происходит, или решение, которое позволило бы нам вернуться к x64.

1 Ответ

2 голосов
/ 24 июля 2014

Я использую Watin на x64, и это вызвало у меня некоторые проблемы.Недавно я просмотрел исходный код Watin, и кажется, что вызовы PInvoke некорректны (корректно работает только в 32-битной системе).Если вы выполняете определенные методы, они перезаписывают некоторые части памяти (поскольку 32b зарезервировано для результата 64b), что приводит к странным ошибкам.

Это только один пример: WatiN-2.1.0.1196 / source / src / Core /Native / Windows / Win32.cs

public static extern Int32 SendMessageTimeout(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam, Int32 fuFlags, Int32 uTimeout, ref Int32 lpdwResult);

VS правильно

public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam, uint fuFlags, uint uTimeout, out IntPtr lResult);

Для полной проверки изменений http://pastebin.com/KaVpM6wT Требуется перестройка библиотеки Watin.Core ипоставляется без гарантии.

...