如何使用Selenium C#开始运行自动测试

811 阅读15分钟

{ "@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#工作了一段时间,我将告诉你为什么。

TIOBE Programming Index

如果我刚刚开始一个项目,我喜欢使用开发团队使用的相同语言,主要有两个原因。

  • 测试项目可以与现有的解决方案集成。
  • 开发团队可以帮助改进测试框架。

Selenium是我的首选,也是最好的测试自动化框架之一,因为我可以使用Selenium的C#绑定来编写自动化测试。在写这篇关于C#自动化测试的博客时,最新的Selenium版本是4.2.0,所以我将在下面的Selenium C#教程中使用该版本。

在这篇关于C#的Selenium教程结束时,你将能够编写在本地和云Selenium网格上无缝工作的自动化测试。

所以,让我们开始吧!

目录

在你开始之前,你需要在你的机器上安装一个代码编辑器。在这个Selenium C#教程中,我将使用Visual Studio,但你可以使用任何你喜欢的IDE来编辑你的代码。

如何创建一个新的Selenium C#项目?

在Visual Studio中创建一个新项目的步骤是非常简单的。请按照下面的步骤在Selenium中用C#创建一个新项目。

  1. 在弹出的窗口中点击 "创建新项目"。

Create a new Selenium C# project

  1. 然后选择你要使用的项目类型。在这个博客中,我们继续使用.NET Core的 "NUnit测试项目"。

NUnit Test Project” for .NET Core

我使用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#项目。

  1. 为它选择一个名称和位置,然后点击 "创建"。

Select a name and a location (1)

你会看到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#测试?

如果你想看到并运行解决方案中的测试,你需要遵循以下步骤。

  1. 打开测试资源管理器(如果还没有打开)。你可以从视图菜单→测试资源管理器中进行。在这个面板中,你可以看到所有可用的测试,按项目和测试分组。
  2. 目前,我们只有VS为我们创建的一个测试,但我们可以右键单击它(或节点中的任何树)并运行它。我们将看到它是否通过,以及测试运行的时间。

How to run Selenium C# tests from Visual Studio

现在让我们继续,看看如何编写我们自己的Selenium WebDriver自动测试。

如何运行你的第一个Selenium C#测试?

是时候采取一些行动了🙂 现在我已经介绍了Selenium与C#的要点,让我们用Selenium C#运行一个使用NUnit框架的简单自动化测试

测试场景

我将使用一个简单的场景来说明如何使用Selenium与C#实现一些基本步骤的自动化。以下是我希望我的测试执行的步骤。

  1. 导航到www.lambdatest.com/selenium-pl…网页。
  2. 在 "Enter Message "输入栏中输入一个文本。
  3. 点击 "Get Checked value"。

验证消息是否被显示。

Test Scenario

很简单,对吗?我们走吧!

你也可以订阅LambdaTest YouTube频道,随时了解围绕自动化浏览器测试Selenium测试、CI/CD等的最新教程。

使用NuGet软件包管理器安装Selenium WebDriver

在我们开始与浏览器、网页和DOM中的WebElements交互之前,我们必须准备好我们的项目。

为此,我们需要添加Selenium.WebDriver的NuGet包,它允许测试代码使用作为该包一部分的方法与页面上的WebElements交互。要在项目中添加NuGet包,请按照以下步骤进行。

  1. 在解决方案资源管理器中右击项目名称→选择 "管理NuGet包...":
    Project name in the Solution Explorer
    这将打开NuGet包面板,你可以看到已经安装在你的项目上的包并添加更多。
  2. 浏览标签中,搜索 "selenium",并从结果中选择Selenium.WebDriver。从右侧的详细信息面板中,从版本下拉菜单中选择一个选项,然后点击安装。在这个Selenium C#教程中,我将使用Selenium 3.141.0版本。

Using Selenium version 3.141.0

另外,你也可以通过在项目位置运行这个命令从命令行安装NuGet包。

dotnet add package Selenium.WebDriver --version 3.141.0

现在,如果你去看已安装的标签,你会看到Selenium.WebDriver被添加到已安装包的列表中。

**注意:**你可能需要使用Selenium WebDriver命令来实现各种浏览器动作的自动化。你可以参考我们之前的文章《NUnit中的Selenium WebDriver命令》来了解更多信息,在用Selenium C#进行自动化UI测试时可能会很方便。

Selenium.WebDriver is added

添加浏览器驱动程序

在开始编写测试之前,我们需要设置的另一件事是添加一个浏览器驱动程序。现在我将在Chrome浏览器上进行测试,所以我需要添加ChromeDriver。它也可以作为一个NuGet包添加,所以按照之前的步骤添加Selenium.WebDriver.ChromeDriver

这里有一点需要确定的是--安装与你机器上安装的浏览器相同的驱动版本。例如,我有Chrome 101.0.4951.67,所以我需要安装同样的驱动版本。

install the same driver version as the browser

你可以从帮助→关于谷歌浏览器检查浏览器的版本。

你可以使用你选择的浏览器,你可以用同样的方法添加驱动,例如,Selenium.WebDriver.MSEdgeDriver(用于Microsoft Edge),Selenium.WebDriver.GeckoDriver(用于Mozilla Firefox)。

实现Selenium C#测试

现在,我们应该准备好开始我们的Selenium C#测试。让我们使用之前创建的类,但把它重命名为有意义的东西。

Implementing Selenium C# test

这里是上述场景的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类提供了在我们的网页上寻找元素的机制。
  • 定位器是用来识别元素的策略。

driver.FindElement(By.Locator("Value"));

有几种Selenium定位器的策略,我们可以根据它们的属性来识别网页元素。

你可以参考这份Selenium定位器小抄,用其简单易用的语法快速浏览所有的Selenium定位器。

当使用*FindElement()*时,创建一个独特的定位器是一个很好的做法;否则,你的测试可能会与一个不同的元素互动。你可以使用Chrome的开发者工具为每个元素找到最佳定位器策略。

你可以右键点击页面上的一个WebElement,然后选择检查。这将打开 "开发者工具 "的 "元素 "选项卡,在那里你可以看到该元素的信息。这里是输入文本的代码。

Elements tab of the Developer Tools

推荐的定位器是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快捷键)并在本地运行测试。该测试将在测试资源管理器中可见。

Running the Selenium C# test

在这里,你可以像以前的测试那样运行它。如果一切顺利,你会看到一个浏览器窗口打开,浏览网页,输入文本,然后点击按钮。测试将通过,并在结束时关闭浏览器窗口。

browser window open up

如何在云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来创建你想要的设置。

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 Automation Tab

这是一个相当简单的测试,所以它将快速完成,与在本地机器上的测试相同。但是这一次你还可以看到测试执行的记录。我发现如果测试失败了,你想看看原因,这特别有帮助。但我个人也喜欢看通过的测试,因为我想确保预定的动作已经正确执行,这样就可以避免假阳性。

你可以使用右边的面板导航到一个特定的步骤,看看那里发生了什么。

right-hand panel to navigate

当然,你可以使用多个设置来验证多个配置上的情景,而且,随着项目的发展,你可以利用平行运行测试的能力。

你可以导航到LambdaTest分析仪表板,使用高级功能来分析测试的性能。从 "测试摘要 "部分,你可以看到所有的测试结果,以及它们的状态和通过或失败的测试总数。从测试概述部分,你可以看到最近执行的测试运行的快照。

LambdaTest Analytics Dashboard

如果你是一名开发人员或测试人员,想掌握用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#。