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;
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top