【问题标题】:Best Practices for modularizing Selenium RC test scripts模块化 Selenium RC 测试脚本的最佳实践
【发布时间】:2013-02-10 21:28:05
【问题描述】:

我正在 Visual Studio (C#) 中创建 Selenium RC 测试脚本。我是 努力重构测试;我所有的测试都在一个 文件。我将不胜感激任何输入和/或指向网站、书籍、 等了解如何模块化测试。

我必须在不同的站点上运行相同的测试(相同的应用程序但 为不同的客户端和登录配置不同),这是 95% 相同的。有人愿意提供一些好的例子或最好的吗 这样做的做法?

谢谢!

【问题讨论】:

    标签: c# selenium nunit selenium-rc


    【解决方案1】:

    编写 Selenium 测试或任何 UI 测试的最佳实践是Page Object Model,这是为每个页面创建一个对象的想法。这些对象中的每一个都对页面进行抽象,因此当您编写测试时,它看起来并不像您一直在使用 Selenium。

    所以对于一个博客,你会做这样的事情来为主页创建一个对象

    public class Home
    {
        private readonly ISelenium _selenium;
    
        /// <summary>
        /// Instantiates a new Home Page object. Pass in the Selenium object created in the test SetUp(). 
        /// When the object in instantiated it will navigate to the root
        /// </summary>
        /// <param name="selenium">Selenium Object created in the tests
        public Home(ISelenium selenium)
        {
            this._selenium = selenium;
            if (!selenium.GetTitle().Contains("home"))
            {
                selenium.Open("/");
            }
        }
    
        /// <summary>
        /// Navigates to Selenium Tutorials Page. Selenium object wll be passed through
        /// </summary>
        /// <returns>SeleniumTutorials representing the selenium_training.htm</returns>
        public SeleniumTutorials ClickSelenium()
        {
            _selenium.Click("link=selenium");
            _selenium.WaitForPageToLoad("30000");
            return new SeleniumTutorials(_selenium);
        }
    
        /// <summary>
        /// Click on the blog or blog year and then wait for the page to load
        /// </summary>
        /// <param name="year">blog or blog year
        /// <returns>Object representing /blog.* pages</returns>
        public Blog ClickBlogYear(string year)
        {
            _selenium.Click("link=" + year);
            _selenium.WaitForPageToLoad("30000");
            return new Blog(_selenium);
        }
        // Add more methods as you need them
    }
    

    然后您将创建一个如下所示的测试

    [TestFixture]
    public class SiteTests
    {
        private ISelenium selenium;
        [SetUp]
        public void Setup()
        {
            selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.theautomatedtester.co.uk");
            selenium.Start();
        }
    
        [TearDown]
        public void Teardown()
        {
            selenium.Stop();
        }
    
        [Test]
        public void ShouldLoadHomeThenGoToXpathTutorial()
        {
            Home home = new Home(selenium);
            SeleniumTutorials seleniumTutorials = home.ClickSelenium();
            SeleniumXPathTutorial seleniumXPathTutorial = seleniumTutorials.ClickXpathTutorial();
            Assert.True(seleniumXPathTutorial.
                        IsInputOnScreen(SeleniumXPathTutorial.FirstInput));
            Assert.True(seleniumXPathTutorial
                        .IsInputOnScreen(SeleniumXPathTutorial.SecondInput));
            Assert.True(seleniumXPathTutorial
                        .IsInputOnScreen(SeleniumXPathTutorial.Total));
        }
    }
    

    【讨论】:

    • 谢谢,我喜欢这个主意。还有一个问题:每个测试都应该用于验证一个特定的 UI 操作吗?
    • 每个测试都应该测试一个工作流程,但切记不要让测试相互依赖
    • 这会导致 selenium 在每次测试运行时启动和停止。这是理想的吗?这可能是一个相当缓慢的过程。在 Setup 之外实例化 selenium 对象并在 Setup 方法中返回 Home 页面以返回基本页面怎么样?您可能会在浏览器中的测试之间保留一些状态,但这对于一组相关测试可能没问题
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2012-05-08
    • 1970-01-01
    • 2018-05-10
    • 2011-06-29
    • 2020-02-05
    相关资源
    最近更新 更多