{ "@context":"schema.org", "@type":"FAQPage", "mainEntity":[{ "@类型":"问题", "名称":"你能用C#使用Selenium吗?", "acceptedAnswer":{ "@type":"答案", "文本":"C#是另一种编程语言,也支持与Selenium绑定。而这种语言的绑定将与java程序一起被更新。" } },{ "@type":"问题", "名称":"Selenium与Java和C#哪个更好?", "acceptedAnswer":{ "@type":"答案", "文本":"谈到编程语言,开发者有很多选择。然而,Java总是第一选择,因为它有大量的在线支持。" } },{ "@type":"问题", "名称":"Selenium C#中的框架是什么?", "acceptedAnswer":{ "@type":"答案", "文本":"Selenium框架是一个开源的库,支持自动网络测试。你可以用包括C#在内的多种编程语言编写测试脚本。" } }] } { "@context": "Selenium框架是一个开源库,支持自动化网络测试。
{ "@context":"schema.org/", "@type":"BreadcrumbList", "itemListElement":[{ "@type":"ListItem", "position":1, "名称":"首页", "项目":"www.lambdatest.com/" },{ "@type":"ListItem", "position":2, "name":"博客", "项目":"www.lambdatest.com/blog/" },{ "@type":"ListItem", "position":3, "name":"如何开始用Selenium C#运行自动测试", "项目":"www.lambdatest.com/blog/seleni…" }] }
Selenium框架本身是一套不同的工具,但最受欢迎的,对新的和有经验的测试人员最有用的是WebDriver。Selenium WebDriver是一个免费的开源工具,允许你与网站互动,进行网络自动化测试。它还支持流行的编程语言,如C#、Java、JavaScript、Python、Ruby和PHP。根据报告,C#在流行程度上仅次于Python、C、Java和C++。我主要使用Selenium C#工作了一段时间,我将告诉你为什么。
如果我刚刚开始一个项目,我喜欢使用开发团队使用的相同语言,主要有两个原因。
- 测试项目可以与现有的解决方案集成。
- 开发团队可以帮助改进测试框架。
Selenium是我的首选,也是最好的测试自动化框架之一,因为我可以使用Selenium的C#绑定来编写自动化测试。在写这篇关于C#自动化测试的博客时,最新的Selenium版本是4.2.0,所以我将在下面的Selenium C#教程中使用该版本。
在这篇关于C#的Selenium教程结束时,你将能够编写在本地和云Selenium网格上无缝工作的自动化测试。
所以,让我们开始吧!
目录
在你开始之前,你需要在你的机器上安装一个代码编辑器。在这个Selenium C#教程中,我将使用Visual Studio,但你可以使用任何你喜欢的IDE来编辑你的代码。
如何创建一个新的Selenium C#项目?
在Visual Studio中创建一个新项目的步骤是非常简单的。请按照下面的步骤在Selenium中用C#创建一个新项目。
- 在弹出的窗口中点击 "创建新项目"。
- 然后选择你要使用的项目类型。在这个博客中,我们继续使用.NET Core的 "NUnit测试项目"。

我使用NUnit是因为它是自动化网络测试最常用的框架之一,将有助于简化我们的测试编写过程。你可以通过这个Selenium NUnit教程来了解更多关于用Visual Studio设置NUnit的信息。NUnit的最新版本是3.13.3。以下是我最喜欢的NUnit的一些功能,它们在我的Selenium C#项目中帮助我。
-
注释--这些是NUnit的属性(或标签),告诉代码如何解释其下实现的方法。其语法是方括号中的属性名称。根据我的经验,一些常用的NUnit注释,也是最常用的注释是。
-
**[SetUp]:**标记一个在每个测试方法之前执行的方法
-
[Test]: 标记一个测试方法的属性
-
**[TearDown]:**在TearDown下实现的方法将在每个测试方法之后执行。
-
**[OneTimeSetUp]:**一个属性,用于表示在测试运行之前,该方法将被调用一次。
-
[**OneTimeTearDown]:**标志着一个方法将在所有测试运行结束后执行。
-
**[TestFixture]:标记一个包含测试的类。从NUnit 2.5开始,它变得可有可无--一个包含测试的类(用[Test]**属性标记)即使没有TestFixture属性也会被识别。
-
断言 - 使用NUnit断言来验证测试是否有预期结果。我通常坚持使用 "经典 "断言。
-
Assert.IsTrue(): 检查一个给定的条件是否为真。
-
Assert.IsFalse(): 检查给定条件是否为假。
-
Assert.AreEqual():检查两个给定对象是否相等。
-
平行化。允许在NUnit中并行执行。
-
**数据驱动的测试。**使用NUnit中的参数化,我们可以使用不同的数据集运行相同的测试。
现在我们得到了这些,让我们继续我们的Selenium with C#项目。
- 为它选择一个名称和位置,然后点击 "创建"。
你会看到Visual Studio自动创建了一个名为UnitTest1.cs的测试类*。*
using NUnit.Framework;
namespace NUnitTestProject1
{
public class Tests
{
[SetUp]
public void Setup()
{
}
[Test]
public void Test1()
{
Assert.Pass();
}
}
}
如何从Visual Studio运行Selenium C#测试?
如果你想看到并运行解决方案中的测试,你需要遵循以下步骤。
- 打开测试资源管理器(如果还没有打开)。你可以从视图菜单→测试资源管理器中进行。在这个面板中,你可以看到所有可用的测试,按项目和测试分组。
- 目前,我们只有VS为我们创建的一个测试,但我们可以右键单击它(或节点中的任何树)并运行它。我们将看到它是否通过,以及测试运行的时间。
现在让我们继续,看看如何编写我们自己的Selenium WebDriver自动测试。
如何运行你的第一个Selenium C#测试?
是时候采取一些行动了 现在我已经介绍了Selenium与C#的要点,让我们用Selenium C#运行一个使用NUnit框架的简单自动化测试。
测试场景
我将使用一个简单的场景来说明如何使用Selenium与C#实现一些基本步骤的自动化。以下是我希望我的测试执行的步骤。
- 导航到www.lambdatest.com/selenium-pl…网页。
- 在 "Enter Message "输入栏中输入一个文本。
- 点击 "Get Checked value"。
验证消息是否被显示。
很简单,对吗?我们走吧!
你也可以订阅LambdaTest YouTube频道,随时了解围绕自动化浏览器测试、Selenium测试、CI/CD等的最新教程。
使用NuGet软件包管理器安装Selenium WebDriver
在我们开始与浏览器、网页和DOM中的WebElements交互之前,我们必须准备好我们的项目。
为此,我们需要添加Selenium.WebDriver的NuGet包,它允许测试代码使用作为该包一部分的方法与页面上的WebElements交互。要在项目中添加NuGet包,请按照以下步骤进行。
- 在解决方案资源管理器中右击项目名称→选择 "管理NuGet包...":
这将打开NuGet包面板,你可以看到已经安装在你的项目上的包并添加更多。 - 在浏览标签中,搜索 "selenium",并从结果中选择Selenium.WebDriver。从右侧的详细信息面板中,从版本下拉菜单中选择一个选项,然后点击安装。在这个Selenium C#教程中,我将使用Selenium 3.141.0版本。
另外,你也可以通过在项目位置运行这个命令从命令行安装NuGet包。
dotnet add package Selenium.WebDriver --version 3.141.0
现在,如果你去看已安装的标签,你会看到Selenium.WebDriver被添加到已安装包的列表中。
**注意:**你可能需要使用Selenium WebDriver命令来实现各种浏览器动作的自动化。你可以参考我们之前的文章《NUnit中的Selenium WebDriver命令》来了解更多信息,在用Selenium C#进行自动化UI测试时可能会很方便。
添加浏览器驱动程序
在开始编写测试之前,我们需要设置的另一件事是添加一个浏览器驱动程序。现在我将在Chrome浏览器上进行测试,所以我需要添加ChromeDriver。它也可以作为一个NuGet包添加,所以按照之前的步骤添加Selenium.WebDriver.ChromeDriver。
这里有一点需要确定的是--安装与你机器上安装的浏览器相同的驱动版本。例如,我有Chrome 101.0.4951.67,所以我需要安装同样的驱动版本。
你可以从帮助→关于谷歌浏览器检查浏览器的版本。
你可以使用你选择的浏览器,你可以用同样的方法添加驱动,例如,Selenium.WebDriver.MSEdgeDriver(用于Microsoft Edge),Selenium.WebDriver.GeckoDriver(用于Mozilla Firefox)。
实现Selenium C#测试
现在,我们应该准备好开始我们的Selenium C#测试。让我们使用之前创建的类,但把它重命名为有意义的东西。
这里是上述场景的Selenium C#测试。
Selenium C#代码演练
使用的包被添加在测试类的开头。
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
然后,我们需要创建一个IWebDriver的新实例。
private IWebDriver driver;
作为测试的前提条件,我们需要启动浏览器。我在SetUp方法中做了这个,因为这是在未来所有的测试中都会用到的,所以这里是我实例化驱动程序的地方。
[SetUp]
public void Setup()
{
driver = new ChromeDriver();
}
接下来,是我们的实际测试。我使用了之前提到的NUnit的*[Test]*属性,在测试方法里面,测试步骤。
为了导航到一个特定的URL,使用C#的Selenium使用*Navigate().GoToUrl()*方法,将URL作为一个字符串参数传递。
driver.Navigate().GoToUrl("https://www.lambdatest.com/selenium-playground/simple-form-demo");
然后,我们需要与页面上的三个WebElements互动,这意味着我们需要定位这些元素。为此,我们在Selenium WebDriver中使用了FindElement()和FindElements()方法。*FindElement()*方法返回一个Web元素对象,而FindElements()则返回一个Web元素的列表。在我们的测试中,FindElement()将完成这项工作。
driver.FindElement(By.Locator("Value"));
- FindElement()方法接受一个By方法参数,并返回与该方法相匹配的第一个元素。
- By类提供了在我们的网页上寻找元素的机制。
- 定位器是用来识别元素的策略。
有几种Selenium定位器的策略,我们可以根据它们的属性来识别网页元素。
-
ID -Selenium的ID定位器使用元素的ID属性。
-
Name -Selenium中的Name定位器使用元素的Name属性。
-
LinkText和PartialLinkText -Selenium中的LinkText和PartialLinkText定位器适用于链接元素。
-
ClassName -Selenium中的ClassName定位器使用元素的Class属性。
-
TagName -Selenium中的TagName定位器使用标签名称来识别属性。
-
CssSelector -Selenium中的CssSelector定位器结合元素选择器和选择器值来寻找网络元素。
-
XPath -Selenium中的XPath定位器使用HTML DOM结构来定位网页中的任何元素
-
Value是该属性的字符串值。
你可以参考这份Selenium定位器小抄,用其简单易用的语法快速浏览所有的Selenium定位器。
当使用*FindElement()*时,创建一个独特的定位器是一个很好的做法;否则,你的测试可能会与一个不同的元素互动。你可以使用Chrome的开发者工具为每个元素找到最佳定位器策略。
你可以右键点击页面上的一个WebElement,然后选择检查。这将打开 "开发者工具 "的 "元素 "选项卡,在那里你可以看到该元素的信息。这里是输入文本的代码。
推荐的定位器是Id,因为它通常比较快。幸运的是,我们在所有需要的元素上都有唯一的Ids,所以我们可以继续使用它们。Selenium C#中的SendKeys()方法用于在输入区域输入文本。它需要一个字符串参数。
driver.FindElement(By.Id("user-message")).SendKeys("LambdaTest rules");
Click()方法用于模拟鼠标点击。
driver.FindElement(By.Id("showInput")).Click();
Text是一个字符串属性,代表Web元素的内部值,我们使用*Assert.IsTrue()*方法来验证消息是否有我们期望的信息。我也喜欢我的测试在失败时显示一个消息,使其更容易调试。
Assert.IsTrue(driver.FindElement(By.Id("message")).Text.Equals("LambdaTest rules"), "The expected message was not displayed.");
要在测试结束时关闭浏览器,请使用TearDown属性和这个方法。
[TearDown]
public void TearDown()
{
driver.Quit();
}
在Selenium WebDriver中也有两个类似的方法。
- *Close()*方法,它可以关闭当前窗口。
- *Quit()*方法,关闭与驱动相关的所有窗口。
对于TearDown,我更喜欢第二种方法,以防一些测试打开额外的窗口(记住,TearDown方法在每个测试后运行)。
运行Selenium C#测试
现在测试已经准备好了,你可以建立项目(右击项目名称,选择建立或使用Ctrl+B快捷键)并在本地运行测试。该测试将在测试资源管理器中可见。
在这里,你可以像以前的测试那样运行它。如果一切顺利,你会看到一个浏览器窗口打开,浏览网页,输入文本,然后点击按钮。测试将通过,并在结束时关闭浏览器窗口。
如何在云Selenium网格上运行Selenium C#测试?
如果你想跨平台或跨浏览器运行自动化测试怎么办?或者使用与你自己的机器不同的设置?这些情况很可能经常发生,因为我们希望我们的应用程序能够为所有的用户工作,而他们的电脑上会有不同的配置。
解决这个问题的办法是将现有的Selenium C#测试移植到LambdaTest这样的基于云的Selenium网格中。像LambdaTest这样基于云的跨浏览器测试平台提供了一个由3000多个浏览器和操作系统组成的在线设备场,可以大规模地进行Selenium C#测试。下面是LambdaTest云Selenium网格的一瞥。
最重要的是,在将现有的测试从本地Selenium网格移植到LambdaTest云网格时,并不涉及太多的移植工作。
以下是我的代码版本,更新后可在LambdaTest网格中运行测试。
实施。
代码演练。
同样,我们已经添加了包。
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using System;
using System.Threading;
接下来,我们要声明我们的变量。
private static IWebDriver driver;
public static string gridURL = "@hub.lambdatest.com/wd/hub";
public static string LT_USERNAME = "LT_USERNAME"; // Add your LamdaTest username here
public static string LT_ACCESS_KEY = "LT_ACCESS_KEY"; // Add your LamdaTest access key here
当使用LambdaTest时,你需要确保使用你的用户名和访问密钥。你可以在你的LambdaTest简介部分找到它们。一个好主意是将它们存储为环境变量,并从那里读取它们。这样一来,如果任何一个值发生变化,你只需要在一个地方更新它们。
最大的变化,正如你所看到的,是在设置中。
[SetUp]
public void Setup()
{
var desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.SetCapability("browserName", "Chrome");
desiredCapabilities.SetCapability("platform", "Windows 11");
desiredCapabilities.SetCapability("version", "101.0");
desiredCapabilities.SetCapability("screenResolution", "1280x800");
desiredCapabilities.SetCapability("user", LT_USERNAME);
desiredCapabilities.SetCapability("accessKey", LT_ACCESS_KEY);
desiredCapabilities.SetCapability("build", "Selenium C-Sharp");
desiredCapabilities.SetCapability("name", "Selenium Test");
driver = new RemoteWebDriver(new Uri("https://" + LT_USERNAME + ":" + LT_ACCESS_KEY + gridURL), desiredCapabilities, TimeSpan.FromSeconds(600));
}
DesiredCapabilities是一个Selenium类,用于配置跨浏览器测试的浏览器属性。你可以使用LambdaTest Capabilities Generator来创建你想要的设置。
测试一直没有改变,我仍然在测试相同的场景。
[Test]
public void ValidateTheMessageIsDisplayed()
{
driver.Navigate().GoToUrl("https://www.lambdatest.com/selenium-playground/simple-form-demo");
driver.FindElement(By.Id("user-message")).SendKeys("LambdaTest rules");
driver.FindElement(By.Id("showInput")).Click();
Assert.IsTrue(driver.FindElement(By.Id("message")).Text.Equals("LambdaTest rules"), "The expected message was not displayed.");
}
而在拆解中,我只添加了一个短暂的睡眠,这样浏览器就不会太快关闭,我在记录中看到了发生的情况。
[TearDown]
public void TearDown()
{
Thread.Sleep(3000);
driver.Quit();
}
在云端执行Selenium C#测试
现在运行这个测试,和之前一样,从Visual Studio中运行。这一次,浏览器不会在本地打开。但如果你连接到你的LambdaTest账户,你会在LambdaTest自动化标签中看到测试正在运行。
这是一个相当简单的测试,所以它将快速完成,与在本地机器上的测试相同。但是这一次你还可以看到测试执行的记录。我发现如果测试失败了,你想看看原因,这特别有帮助。但我个人也喜欢看通过的测试,因为我想确保预定的动作已经正确执行,这样就可以避免假阳性。
你可以使用右边的面板导航到一个特定的步骤,看看那里发生了什么。
当然,你可以使用多个设置来验证多个配置上的情景,而且,随着项目的发展,你可以利用平行运行测试的能力。
你可以导航到LambdaTest分析仪表板,使用高级功能来分析测试的性能。从 "测试摘要 "部分,你可以看到所有的测试结果,以及它们的状态和通过或失败的测试总数。从测试概述部分,你可以看到最近执行的测试运行的快照。
如果你是一名开发人员或测试人员,想掌握用C#进行Selenium自动化测试的基础知识,你可以参加Selenium C# 101认证,以证明你作为测试人员的可信度。
下面是LambdaTest公司对Selenium C# 101认证的简短介绍。
结论
如果你刚刚开始测试自动化,使用Selenium与C#和NUnit可以说是一个不错的选择。在这个Selenium C#教程中,我们涵盖了开始测试自动化项目的主要步骤,从选择测试框架到确定WebElements,与它们进行交互,以及添加验证。我们还看到了如何在不同的设置上远程运行测试,看到结果和记录。
常见问题(FAQ)
你能在C#中使用Selenium吗?
C#是另一种编程语言,也支持与Selenium绑定。而且这种语言的绑定会随着java程序的更新而更新。
Selenium与Java和C#哪个更好?
在编程语言方面,开发者有很多选择。然而,Java总是第一选择,因为它有大量的在线支持。
什么是Selenium C#的框架?
Selenium框架是一个支持自动化网络测试的开源库。你可以用各种编程语言编写测试脚本,包括C#。