plugin - WatiN en Visual Studio 2008-falla el segundo método de prueba
visual studio code extensions (3)
Cuando intento ejecutar una prueba muy simple de WatiN 2.0 (CTP3) en Visual Studio 2008, descubrí que la primera siempre se ejecuta correctamente. El segundo método de prueba parece romper algo en el objeto IE produciendo la siguiente excepción:
Método de prueba testProject.WatinTest.testTwo lanzó excepción: System.Runtime.InteropServices.InvalidComObjectException: el objeto COM que se ha separado de su RCW subyacente no se puede usar.
Un código de muestra está debajo. Debido a la forma en que funciona el método de inicialización en VS2008, la variable del navegador debe definirse como static
lo que creo que podría ser la clave del problema. Desafortunadamente, a menos que el navegador se abra en el método común, significa una ventana separada para cada prueba que no es ideal
Estaría muy agradecido por cualquier idea sobre cómo solucionar eso. La búsqueda de Google y la búsqueda SO no arrojaron ningún resultado útil, por lo que espero que una buena respuesta a esta pregunta ayude a la comunidad. Muchas gracias,
private static IE ie
[ClassInitialize]
public static void testInit(TestContext testContext)
{
ie = new IE("http://news.bbc.co.uk");
}
[TestMethod]
public void testOne()
{
Assert.IsTrue(ie.ContainsText("Low graphics"));
}
[TestMethod]
public void testTwo()
{
Assert.IsTrue(ie.ContainsText("Low graphics"));
}
Creo que está relacionado con la forma en que mantienes la variable IE. Lo he estado usando sin problemas como en la muestra: http://watin.sourceforge.net/ . Veo las pruebas de watin como más pruebas funcionales / de integración que las pruebas unitarias, por lo que cada prueba es más como una historia con diferentes interacciones. Utilizo el patrón de Objeto de página para ayudar a estructurar el código; consulte http://code.google.com/p/webdriver/wiki/PageObjects .
PD. He considerado reutilizar la instancia pero realmente no lo he intentado. Las instancias de apertura / cierre del navegador agregan tiempo a las pruebas.
He escuchado este problema antes y quise investigar esto por un tiempo. Ahora que WatiN 2.0 beta 1 está disponible, me senté y creé una clase de ayuda para resolver este problema con Visual Studio Test Runner. Siguiendo la clase de ayuda y la clase de prueba renovada. También blogueé sobre esta solución para darle aún más exposición.
public class IEStaticInstanceHelper
{
private IE _ie;
private int _ieThread;
private string _ieHwnd;
public IE IE
{
get
{
var currentThreadId = GetCurrentThreadId();
if (currentThreadId != _ieThread)
{
_ie = IE.AttachToIE(Find.By("hwnd", _ieHwnd));
_ieThread = currentThreadId;
}
return _ie;
}
set
{
_ie = value;
_ieHwnd = _ie.hWnd.ToString();
_ieThread = GetCurrentThreadId();
}
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
}
Y la clase de prueba que usa este ayudante:
[TestClass]
public class UnitTest
{
private static IEStaticInstanceHelper ieStaticInstanceHelper;
[ClassInitialize]
public static void testInit(TestContext testContext)
{
ieStaticInstanceHelper = new IEStaticInstanceHelper();
ieStaticInstanceHelper.IE = new IE("http://news.bbc.co.uk");
}
public IE IE
{
get { return ieStaticInstanceHelper.IE; }
set { ieStaticInstanceHelper.IE = value; }
}
[ClassCleanup]
public static void MyClassCleanup()
{
ieStaticInstanceHelper.IE.Close();
ieStaticInstanceHelper = null;
}
[TestMethod]
public void testOne()
{
Assert.IsTrue(IE.ContainsText("Low graphics"));
}
[TestMethod]
public void testTwo()
{
Assert.IsTrue(IE.ContainsText("Low graphics"));
}
}
HTH, Jeroen
Estaba buscando lo mismo, y la respuesta de jvmenen me ayudó. Sin embargo, ha habido algunas actualizaciones de WatiN desde que se dio la respuesta, así que tuve que reescribir la clase de ayuda un poco para ser coherente con la última versión de WatiN (actualmente 2.0.20).
WatiN ya no contiene la función IE.AttachToIE
, así que tuve que modificar eso un poco. Además, también hice la clase de ayuda utilizando genéricos, de modo que se puede usar cualquier tipo de navegador y no solo IE (creo que IE y Firefox son compatibles con WatiN ahora, y Chrome está por venir).
Entonces, en caso de que alguien más esté buscando esto también, aquí está mi versión de IEStaticInstanceHelper
(ahora llamada StaticBrowserInstanceHelper
):
class StaticBrowserInstanceHelper<T> where T : Browser
{
private Browser _browser;
private int _browserThread;
private string _browserHwnd;
public Browser Browser
{
get
{
int currentThreadId = GetCurrentThreadId();
if (currentThreadId != _browserThread)
{
_browser = Browser.AttachTo<T>(Find.By("hwnd", _browserHwnd));
_browserThread = currentThreadId;
}
return _browser;
}
set
{
_browser = value;
_browserHwnd = _browser.hWnd.ToString();
_browserThread = GetCurrentThreadId();
}
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
}
Espero que esto ayude a alguien :)