Selenium+SpecFlow自动化测试一天实践(C#)

  一年前在和一位大神的聊天中了解了Selenium自动化测试,兴冲冲买了《零成本实现Web自动化测试——基于Selenium WebDriver和Cucumber》,看了前几章一头雾水,被各种理论打懵了。从此觉得自动化测试好厉害,但是好遥远,没有单元测试那么简单易学啊。

  这两天,网站前期开发的一个大坑被挖出来了,几乎把整个项目的所有页面都改了。加上前期开发的新功能在SVN里一合并,看着一大堆冲突,我心里彻底没底了,想着要测试一遍,但是那么多页面和业务一测就是几天。

  要是所有的测试能够自动化,以后能够随便扩展场景和业务逻辑就好了,回想起了Selenium,我就硬着头皮试试看写个web测试吧。

一、Selenium

  根据网上资料,第一代Selenium主要分RC版本和IDE版本。后者只能在FireFox上使用,前者可以在任何浏览器上用,而且支持各种语言。RC版本好像就是我要的了,网上一搜,发现用起来很麻烦,而且大部分是Java,有Server端和Client端之分,Server端需要jdk编译,使用方法基本是命令行,为了图快只好抛弃了。。

  后来在nuget里找到了WebDriver,其实也就是Selenium2.0,果断装上。结合网上对WebDriver的一些案例,马上成功写出了一个登录web验证

  我的项目最终NuGet包如下:

  主要安装WebDriver应该就可以了,其它是依赖项,可以自动安装的

  这里主要参考了http://blog.sina.com.cn/s/blog_5c9288aa0101de2u.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenQA.Selenium;
using NUnit.Framework;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
namespace ConsoleApplication1
{
    [TestFixture]
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.SetupTest();
            p.TheUntitledTest();
            p.TeardownTest();

        }
        private IWebDriver driver;
        private StringBuilder verificationErrors;
        private string baseURL;
        private bool acceptNextAlert = true;

        [SetUp]
        public void SetupTest()
        {
            driver = new ChromeDriver();
            baseURL = "";
            verificationErrors = new StringBuilder();
        }

        [TearDown]
        public void TeardownTest()
        {
            try
            {
                driver.Quit();
            }
            catch (Exception)
            {
                // Ignore errors if unable to close the browser
            }
            Assert.AreEqual("", verificationErrors.ToString());
        }

        [Test]
        public void TheUntitledTest()
        {
            driver.Navigate().GoToUrl(baseURL);
            driver.FindElement(By.Id("LoginName")).Clear();
            driver.FindElement(By.Id("LoginName")).SendKeys("");
            driver.FindElement(By.Id("password")).Clear();
            driver.FindElement(By.Id("password")).SendKeys("");
            driver.FindElement(By.Id("")).Click();

            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
            wait.Until<bool>((d) =>
            {
                try
                {
                    IWebElement element = d.FindElement(By.Id(""));
                    Assert.AreEqual(element.FindElement(By.ClassName("")).Text, "");
                    return false;
                }
                catch (NoSuchElementException)
                {
                    return true;
                }
            });
        }
        private bool IsElementPresent(By by)
        {
            try
            {
                driver.FindElement(by);
                return true;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }

        private bool IsAlertPresent()
        {
            try
            {
                driver.SwitchTo().Alert();
                return true;
            }
            catch (NoAlertPresentException)
            {
                return false;
            }
        }

        private string CloseAlertAndGetItsText()
        {
            try
            {
                IAlert alert = driver.SwitchTo().Alert();
                string alertText = alert.Text;
                if (acceptNextAlert)
                {
                    alert.Accept();
                }
                else
                {
                    alert.Dismiss();
                }
                return alertText;
            }
            finally
            {
                acceptNextAlert = true;
            }
        }
    }
}

  运行时报错,找不到文件chromedriver.exe,网上搜了下,在官网上下载好,放在程序运行目录,就可以跑了

  前面代码中需要注意一点,WebDriverWait一节主要是为了等待网页刷新完成,不然的话,没等页面跳转,就开始抓元素或者判断了,肯定会错。这里主要用到了显式的等待

  参考http://blog.csdn.net/aerchi/article/details/8055913

  测试通过,但是每个测试实例都要这样写一遍,工作量还是太大了!

  如此巨大的测试代码肯定需要一个框架进行组织吧。这里就轮到了SpecFlow。

二、SpecFlow

  SpecFlow其实就是Cucumber .NET版本,Cucumber官网上找到的。Cucumber是验收测试的一种实现,语法几乎和自然语言一样,相当于纯黑盒的测试。

  语法就是在什么场景下(Scenary),有什么样的先决条件(Given),会执行什么行为得到什么结果(Then)

  除了Nuget包(参考上面),还需要安装vs插件才能使用

  SpecFlow官网对具体使用方法其实有简单案例、也有很详细的文档。当然大部分是英文,我看英文的速度太慢了,所以暂时用到哪个去查。

  添加的Feature文件

  右键Feature文件编辑窗口内部,生成对应的动作

  以下是其中一段内容

        [Then(@"Where ‘(.*)‘ display in ‘(.*)‘")]
        public void ThenWhereDisplayIn(string p0, string p1)
        {
            WebDriverWait wait = new WebDriverWait(WebBrowser.Current, TimeSpan.FromSeconds(10));
            wait.Until<bool>((d) =>
            {
                try
                {
                    Assert.AreEqual(WebBrowser.Current.FindElement(By.CssSelector(p1)).Text, p0);
                    return false;
                }
                catch (NoSuchElementException)
                {
                    return true;
                }
            });
        }

  WebBrowser.Current是一个单例的SeleniumDriver实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TechTalk.SpecFlow;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
namespace SeleniumTest
{
    public static class WebBrowser
    {
        public static ChromeDriver Current
        {
            get
            {
                if (!ScenarioContext.Current.ContainsKey("browser"))
                    ScenarioContext.Current["browser"] = new ChromeDriver();

                return ScenarioContext.Current["browser"] as ChromeDriver;
            }
        }
    }
}

  这样,就可以通过扩充Scenery,重用所有的验证了。

三、总结

  NUnit:单元测试框架,提供各种断言和测试引擎。

  NSubstitute:许久不用,这次也没用到,用来虚拟对象,单元测试中较常见。

  Selenium:实现web自动化测试,靠他打开测试浏览器,自动输入等。

  Cucumber&SpecFlow:自动化测试框架,行为驱动开发、验收测试。

  关于Selenium和SpecFlow还有许多其它的特性还有待我去挖掘。

时间: 2024-10-12 17:11:17

Selenium+SpecFlow自动化测试一天实践(C#)的相关文章

Python(一)|selenium + python自动化测试环境搭建

selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多优点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于不同的语言它只是一个包而已,而QTP需要下载安装1个多G 的程序. *  这也是最重要的一点,不管你以前更熟悉C. java.ruby.python.或都是C# ,你都可以通过selenium完成自动化测试,而QTP只支持VBS *  支持多平台:windows.linux.MAC ,支持多浏览器:ie.f

移动端混合型App(hybrid app)自动化测试选型与实践

背景 公司产品的业务已经发展到了移动端,开发选型已经结束,决定使用phonegap做移动端的web应用开发平台.考虑到业务的复杂与多样,移动端的测试同样需要自动化.在网上看了很多,最终锁定了3个移动端测试工具:Selendroid,Appium,Robotium.之所以选择他们3个,是因为团队已经有了以Selenium为基础的测试框架,而这三个工具与Selenium可以说一脉相承. 目标 基于phonegap的混合型app(hybrid app)web应用移动端自动化测试 选型过程 Selend

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

简介 前边一直在分享testng的相关文章,看了点赞量和阅读数不是很高,宏哥猜测估计是大家确实是用不到或者不喜欢吧!不过宏哥经过一段时间的准备,appium的自动化测试框架完善的差不多了,那么接下来宏哥继续给小伙伴和童鞋们分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 主要是一些配置信息的封装. 参考代码 platformName: Android #模拟器 platformVersion: 5.1.1 devi

基于Selenium的自动化测试框架 - SeLion学习之一(基本介绍)

SeLion是一个基于Selenium的自动化测试框架,是Selenium下的一款非常优秀的框架结构,但是资料非常少,在国内使用的也就相对较少,本人会用一系列的文章,比较详细的介绍该框架结构,希望能给广大的自动化测试爱好者提供一个实现思路,如果对该本人文章感兴趣或者有什么问题,欢迎留言,我会尽量回答,也欢迎转载该系列文章.该文章是本系列第一节,SeLion的基本介绍,先让大家对SeLion有一个基本的认识. 一:SeLion是什么?SeLion是基于Selenium的一款开源测试框架,是对Sel

selenium + python自动化测试环境搭建

selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于不同的语言它只是一个包而已,而QTP需要下载安装1个多G 的程序. *  这也是最重要的一点,不管你以前更熟悉C. java.ruby.python.或都是C# ,你都可以通过selenium完成自动化测试,而QTP只支持VBS *  支持多平台:windows.linux.MAC ,支持多浏览器:ie.f

Discuz建站教程:本地安装discuz网站,使用selenium做自动化测试

使用Discuz搭建一个论坛网站,使用selenium做自动化测试,发帖等 http://jingyan.baidu.com/article/b87fe19eb57ff252183568d9.html

[软件测试基础2]基于selenium的自动化测试

这次上机我们主要使用Selenium进行自动化测试,首先我们需要下载selenium-java的依赖项. 若使用maven管理项目,则在.pom文件中加入如下依赖项: 1 <dependency> 2 <groupId>org.seleniumhq.selenium</groupId> 3 <artifactId>selenium-java</artifactId> 4 <version>2.53.0</version>

软件测试Lab2————用selenium进行自动化测试

本次实验内容为用selenium进行自动化测试 主要分为以下几个步骤: 1.安装SeleniumIDE插件 2.学会使用SeleniumIDE录制脚本和导出脚本 3.访问http://www.ncfxy.com使用学号登录系统(账户名为学号,密码为学号后6位),进入系统后可以看到该用户的邮箱. 4.编写Selenium Java WebDriver程序,测试info.csv表格中的学号和邮箱的对应关系是否正确. 5.将测试代码提交到github上. 一.安装SeleniumIDE插件 Selen

selenium ide 自动化测试

selenium ide 自动化测试目前仅仅支持firefox,自动化测试不仅仅能测试你开发的程序,我更倾向于用自动化测试脚本登录各网站,省去繁琐的登录. 自动化测试工具selenium ide 的安装: 下载:    selenium-ide-2.5.0,在百度云网盘中. 安装软件该ide: 在火狐的附件组件,选择从文件安装, 脚本录制: 打开ide,在ide地址栏输入要访问的网页地址,点击录制按钮,然后在浏览器打开对应的网址,你所点击的每一步将被自动记录下来,直到点击停止录制按钮.点击文件的