代码之家  ›  专栏  ›  技术社区  ›  Ilya Kochetov

Visual Studio 2008中的WatiN-第二种测试方法失败

  •  8
  • Ilya Kochetov  · 技术社区  · 15 年前

    在VisualStudio2008中尝试运行一个非常简单的Watin2.0(CTP3)测试时,我发现第一个测试总是执行得很好。第二种测试方法似乎破坏了IE对象中的某些内容,产生了以下异常:

    试验方法 System.Runtime.InteropServices.InvalidComObject异常: 不能从其基础RCW 习惯于

    static 我相信这可能是解决问题的关键。不幸的是,除非用普通方法打开浏览器,否则这意味着每个测试都有一个单独的窗口,这并不理想

    如果有任何关于如何解决这个问题的想法,我将不胜感激。


        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 回复  |  直到 15 年前
        1
  •  10
  •   Jeroen van Menen    15 年前

    我以前听说过这个问题,打算调查一下。现在WatiN 2.0 beta 1可用了,我坐下来创建了一个帮助器类,用Visual Studio test runner解决这个问题。遵循helper类和改进的测试类。我也 blogged

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

    嗯,,

        2
  •  8
  •   Julian    14 年前

    WatiN不再包含 IE.AttachToIE 函数,所以我不得不稍微修改一下。此外,我还使用泛型创建了helper类,因此可以使用任何浏览器类型,而不仅仅是IE(我相信现在WatiN支持IE和Firefox,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();
        }
    }
    

        3
  •  0
  •   eglasius    15 年前

    我认为这与保持IE变量的方式有关。我一直在使用它,没有遇到任何问题,如示例中所示: http://watin.sourceforge.net/ http://code.google.com/p/webdriver/wiki/PageObjects .