安装(VS扩展、程序包)

【工具】->【扩展管理器】,安装SpecFlow

【工具】->【库程序包管理】->【程序包管理器控制台】

PM> Install-Package SpecFlow -Version 1.9.
PM> Install-Package NUnit
PM> Install-Package Selenium.WebDriver
PM> Install-Package Should

使用中文

# language: zh-CN

and * ,而且,并且,同时
background 背景
but * ,但是
examples 例子
feature 功能
given * ,假如,假设,假定
scenario 场景,剧本
scenarioOutline 场景大纲,剧本大纲
then * ,那么  
when * ,当

我想开始新游戏

作为破译者/我想开始新游戏.feature

作为破译者/我想开始新游戏Steps.cs

 using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using Should;
using TechTalk.SpecFlow; namespace CodeBreakerGame.Specs.作为破译者
{
[Binding]
public class 我想开始新游戏Steps
{
private IWebDriver driver = new FirefoxDriver(); [Given(@"游戏还没有开始")]
public void 假如游戏还没有开始()
{
driver.Navigate().GoToUrl("http://localhost:1387/Game/Index");
} [When(@"我开始新游戏")]
public void 当我开始新游戏()
{
driver.FindElement(By.TagName("button")).Click();
} [Then(@"我应该看到""(.*)""")]
public void 那么我应该看到(string message)
{
driver.FindElement(By.TagName("div")).Text.ShouldContain(message);
} [AfterScenario]
public void AfterScenario()
{
driver.Quit();
}
}
}

我想提交猜测的密码

作为破译者/我想提交猜测的密码.feature

作为破译者/我想提交猜测的密码Steps.feature

 using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using Should;
using TechTalk.SpecFlow; namespace CodeBreakerGame.Specs.作为破译者
{
[Binding]
public class 我想提交猜测的密码Steps
{
private IWebDriver driver = new FirefoxDriver(); [Given(@"真实密码是""(.*)""")]
public void 假如真实密码是(int code)
{
driver.Navigate().GoToUrl("http://localhost:1387/Game/Guess/" + code.ToString());
} [When(@"我猜""(.*)""")]
public void 当我猜(int guess)
{
driver.FindElement(By.Id("Guess")).SendKeys(guess.ToString());
driver.FindElement(By.TagName("button")).Click();
} [Then(@"标记为""(.*)""")]
public void 那么标记为(string mark)
{
driver.FindElement(By.TagName("strong")).Text.ShouldEqual(mark);
} [AfterScenario]
public void AfterScenario()
{
driver.Quit();
}
}
}

Action

 [HttpPost]
public ActionResult Guess(string code, FormCollection collection)
{
var guess = collection["Guess"]; var mark = "";
for (int i = ; i < code.Length; i++)
{
if (code[i] == guess[i])
mark += "+";
} for (int i = ; i < code.Length; i++)
{
for (int j = ; j < code.Length; j++)
{
if (i != j && code[i] == guess[j])
mark += "-";
}
} return View(new[] { guess, mark });
}

测试结果

源代码

CodeBreakerGame.rar

说明:由于受文件大小的限制,压缩包里删除了文章开头提到的4个库程序包

Selenium和Firefox版本兼容性对照表

Selenium Firefox
2.53.1 47.0.1

说明:需要注意Selenium.WebDriver和Firefox的版本,如果不兼容可能导致测试运行不了

参考文献

[1] http://www.specflow.org/

[2] https://github.com/cucumber/gherkin/blob/master/gherkin-languages.json

[3] https://github.com/SeleniumHQ/selenium

[4] http://seleniumhq.github.io/selenium/docs/api/dotnet/

[5] http://www.specflow.org/documentation/

VS2010中使用 SpecFlow + Selenium.WebDriver的更多相关文章

  1. Selenium_用selenium webdriver实现selenium RC中的类似的方法

    最近想总结一下学习selenium webdriver的情况,于是就想用selenium webdriver里面的方法来实现selenium RC中操作的一些方法.目前封装了一个ActionDrive ...

  2. Selenium WebDriver中一些鼠标和键盘事件的使用

    转自:http://www.ithov.com/linux/133271.shtml 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击 ...

  3. Java中通过Selenium WebDriver定位iframe中的元素

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题:有一些元素,无论是通过id或是xpath等等,怎么都定位不到. 分析:这很可能是因为你要定位 ...

  4. Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)

    本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...

  5. 转:总结Selenium WebDriver中一些鼠标和键盘事件的使用

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

  6. Selenium WebDriver 中鼠标和键盘事件分析及扩展[转载]

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/ 概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模 ...

  7. 总结Selenium WebDriver中一些鼠标和键盘事件的使用

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

  8. selenium.webdriver.common.keys 模块中常用的变量

    表11-5 selenium.webdriver.common.keys 模块中常用的变量属性 含义Keys.DOWN, Keys.UP, Keys.LEFT,Keys.RIGHT 键盘箭头键Keys ...

  9. Selenium WebDriver 中鼠标和键盘事件分析及扩展

    [From] http://www.51testing.com/html/18/631118-861557.html 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和 ...

随机推荐

  1. onerror事件

    onerror 事件会在文档或图像加载过程中发生错误时被触发. 案例: <img onerror="this.onerror=null;this.src='/images/common ...

  2. Javascript中类型: undefined, number ,string ,object ,boolean

    var a1; var a2 = true;var a3 = 1;var a4 = "Hello";var a5 = new Object();var a6 = null;var ...

  3. 20145222黄亚奇《网络对抗》- shellcode注入&Return-to-libc攻击深入

    20145222黄亚奇<网络对抗>- shellcode注入&Return-to-libc攻击深入 shellcode注入实践过程

  4. 深入理解Java虚拟机(1)--Java内存区域

    运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用 ...

  5. 分布式技术 webapi 路由追加html、aspx、shtml 适用于 对接 安卓、IOS

    首先是这样,在对接安卓和IOS或者是第三方调用的接口,我需要在服务端返回一个带.html/.aspx这样后缀的接口. 例子如下图:http://localhost:64131/api/UsersInf ...

  6. windows系统下载地址大全&大白菜下载和教程

    win10的 Windows10 64位纯净系统下载(不建议,后面的有原版) http://cjxt.sysdaa.com/down.php?post=win10-64&action=bend ...

  7. C++中map的用法

    map的特性是,所有元素都会根据元素的减值自动被排序.map的所有元素都是pair,同时拥有实值(value)和键值(key).pair的第一个元素会被视为键值,第二个元素会被视为实值.map不允许两 ...

  8. PHP 404伪装

    <?php function GetCurUrl() { if(!empty($_SERVER["REQUEST_URI"])) { $scriptName = $_SERV ...

  9. 容器编排Kubernetes之kube-dns源码解读

    注:阅读DNS源码前,可以阅读DNS原理入门增加对DNS的认识. 架构图 这是我简单画的架构图,希望能帮助大家理解. 代码结构 k8s.io | dns | cmd // 三大组件的入口 | dnsm ...

  10. LeetCode第[17]题(Java):Letter Combinations of a Phone Number

    题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...