Problema de anexar watin ao ie
-
26-09-2019 - |
Pergunta
Estou experimentando o Watin para nossos testes de interface do usuário, posso fazer com que os testes funcionem, mas não consigo fechar o IE depois.
Estou tentando fechar o IE no meu código de limpeza de classe, usando o exemplo de Watin Técnica IestaticInstanceHelper.
O problema parece estar anexando ao tópico do IE, que tempo de fora:
_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
(_iehwnd é o identificador para o IE armazenado quando o IE é lançado pela primeira vez.)
Isso dá o erro:
Método de limpeza de classe Class1.MyclassCleanup Falhou. Mensagem de erro: watin.core.exceptions.browSernotfoundException: Não foi possível encontrar uma restrição de correspondência de janela do IE: atributo 'hwnd' igual a '1576084'. Pesquisa expirou após '30' segundos .. Stack Trace: em watin.core.native.intertexplorer.attachtoiehelper.find (restrição findby, timeout int32, boolean waitforcomplete)
Tenho certeza de que devo estar perdendo algo óbvio, alguém tem alguma idéia sobre isso? Obrigado
Para completar, o ajudante estático se parece com o seguinte:
public class StaticBrowser
{
private IE _instance;
private int _ieThread;
private string _ieHwnd;
public IE Instance
{
get
{
var currentThreadId = GetCurrentThreadId();
if (currentThreadId != _ieThread)
{
_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
_ieThread = currentThreadId;
}
return _instance;
}
set
{
_instance = value;
_ieHwnd = _instance.hWnd.ToString();
_ieThread = GetCurrentThreadId();
}
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
}
E o código de limpeza se parece com o seguinte:
private static StaticBrowser _staticBrowser;
[ClassCleanup]
public static void MyClassCleanup()
{
_staticBrowser.Instance.Close();
_staticBrowser = null;
}
Solução 3
Eu mesmo consertei isso despejando mstest e usando mbunit. Também descobri que também não precisava usar nenhuma das coisas do IestaticInstanceHelper, apenas funcionou.
Outras dicas
O problema é que, quando Mstest executa o método com o [ClassCleanup]
atributo, ele será executado em um tópico que não faz parte do Sta.
Se você executar o seguinte código, ele deve funcionar:
[ClassCleanup]
public static void MyClassCleanup()
{
var thread = new Thread(() =>
{
_staticBrowser.Instance.Close();
_staticBrowser = null;
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
O site Watin menciona brevemente que Watin não funcionará com threads não no STA aqui Mas não é óbvio que [TestMethod]
é executado no STA enquanto métodos como [ClassCleanup]
e [AssemblyCleanupAttribute]
não faça.
Por padrão, quando o objeto do IE é destruído, eles automaticamente o navegador.
Seu código de limpeza pode tentar encontrar um navegador já fechado, o que você tem um erro.