WatiN в Visual Studio 2008 - сбой второго метода тестирования - PullRequest
8 голосов
/ 25 марта 2009

При попытке запустить очень простой тест WatiN 2.0 (CTP3) в Visual Studio 2008 я обнаружил, что первый тест всегда выполняется нормально. Второй метод тестирования, кажется, что-то ломает в объекте IE, вызывая следующее исключение:

Метод испытания testProject.WatinTest.testTwo бросил исключение: System.Runtime.InteropServices.InvalidComObjectException: COM-объект, который был отделен из лежащего в его основе RCW нельзя б ..

Пример кода приведен ниже. Из-за способа, которым метод инициализации работает в VS2008, переменная браузера должна быть определена как static, что, я считаю, может быть ключом к проблеме. К сожалению, если браузер не открыт в общем методе, это означает отдельное окно для каждого теста, который не идеален

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


    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"));
    }

Ответы [ 3 ]

10 голосов
/ 31 марта 2009

Я слышал эту проблему раньше и намеревался разобраться в этом некоторое время. Теперь, когда WatiN 2.0 beta 1 доступна, я сел и создал класс помощника, чтобы решить эту проблему с тестовым прогоном Visual Studios. После класса помощника и обновленного класса тестирования. Я также написал в блоге об этом решении, чтобы дать ему еще больше информации.

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();
    }
}

И тестовый класс с использованием этого помощника:

[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"));
    }
}

НТН, Йерун

8 голосов
/ 12 июля 2010

Я искал то же самое, и ответ jvmenen помог мне. Однако с тех пор, как был дан этот ответ, в WatiN произошли некоторые обновления, поэтому мне пришлось немного переписать класс помощника, чтобы он соответствовал последней версии WatiN (в настоящее время 2.0.20).

WatiN больше не содержит функцию IE.AttachToIE, поэтому мне пришлось немного ее изменить. Кроме того, я также сделал вспомогательный класс с использованием обобщений, чтобы можно было использовать любой тип браузера, а не только IE (я думаю, что IE и Firefox теперь поддерживаются WatiN, и Chrome должен появиться).

Так что, если кто-то еще ищет это, вот моя версия IEStaticInstanceHelper (теперь называется 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();
    }
}

Надеюсь, это кому-нибудь поможет:)

0 голосов
/ 25 марта 2009

Я думаю, это связано с тем, как вы держите переменную IE. Я использовал его без проблем, как в примере: http://watin.sourceforge.net/. Ватин-тесты я считаю более функциональными / интеграционными тестами, чем модульными, поэтому каждый тест больше похож на историю с различными взаимодействиями. Я использую шаблон Page Object, чтобы помочь структурировать код - см. http://code.google.com/p/webdriver/wiki/PageObjects.

Ps. Я рассмотрел возможность повторного использования экземпляра, но на самом деле не пробовал. Открытие / закрытие экземпляров браузера добавляет время к тестам.

...