ZetCode

C# Selenium

最后修改于 2023 年 7 月 5 日

C# Selenium 教程展示了如何使用 C# 中的 Selenium 框架自动化 Web 应用程序测试。Selenium 是一个用于测试 Web 应用程序的可移植框架。

Selenium

Selenium 是一个用于测试 Web 应用程序的可移植框架。 Selenium 可以在 Windows、Linux 和 macOS 上运行。

Selenium WebDriver 是一组开源 API,用于自动化 Web 应用程序的测试。 Chrome、Firefox、Opera、Microsoft Edge 等浏览器都有特定的驱动程序。 这些驱动程序需要下载并放置在 PATH 上。 Selenium WebDriver 支持不同的编程语言,包括 Python、C# 和 Java。

Selenium 可以在完整模式或无头模式下运行。 在无头模式下,浏览器不会启动。

Selenium 驱动程序

我们需要下载我们使用的浏览器的驱动程序。 在本教程中,我们选择了 EdgeDriver。 该驱动程序位于 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

C# 安装 Selenium NuGet 包

要在 C# 程序中使用 Selenium 驱动程序,我们需要添加必要的 NuGet 包。

$ dotnet add package Selenium.WebDriver

这会安装 Selenium.WebDriver

$ dotnet add package DotNetSeleniumExtras.WaitHelpers

此外,我们需要安装 DotNetSeleniumExtras.WaitHelpers 以获得预期的等待条件。

C# Selenium 简单示例

在第一个例子中,我们获取网页的标题。

Program.cs
using OpenQA.Selenium.Edge;

var eo = new EdgeOptions();
eo.AddArgument("headless");

var driver = new EdgeDriver(eo);

try
{
    var url = "http://webcode.me";

    driver.Url = url;
    Console.WriteLine(driver.Title);
}
finally
{
    driver.Quit();
}

该程序在无头模式下运行 Selenium。 它检索网站的标题。

var eo = new EdgeOptions();
eo.AddArgument("headless");

var driver = new EdgeDriver(eo);

我们创建 EdgeDriver 的一个实例。 添加了一个选项以在无头模式下运行 Selenium。

try
{
    var url = "http://webcode.me";

    driver.Url = url;
    Console.WriteLine(driver.Title);
}
finally
{
    driver.Quit();
}

我们导航到给定的 URL 并获取标题。 最后,我们退出驱动程序。

C# Selenium 测试段落内容

在下一个示例中,我们测试两个段落的内容。 我们使用 NUnit 框架。

Tests.cs
using NUnit.Framework;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium;

namespace Paragraphs;

public class Tests
{
    private string url = "http://webcode.me";
    private IWebDriver driver;

    [SetUp]
    public void Setup()
    {
        var eo = new EdgeOptions();
        eo.AddArgument("headless");

        driver = new EdgeDriver(eo);
    }

    [Test]
    public void TestParagraphs()
    {
        driver.Url = url;

        var e1 = driver.FindElement(By.CssSelector("body > p:first-child"));
        var e2 = driver.FindElement(By.CssSelector("body > p:nth-child(2)"));

        Assert.That(e1.Text, Does.Contain("Today is a beautiful day."));
        Assert.That(e2.Text, Does.Contain("How are you?"));
    }

    [TearDown]
    public void TearDown() => driver.Quit();
}

我们使用 FindElement 方法来定位标签。 我们使用 CSS 选择器识别段落标签,并将内容与 Assert.That 断言进行比较。

C# Selenium 点击按钮

在以下示例中,我们单击一个按钮并检索对话框的内容。

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test page</title>
</head>
<body>

    <button id="mybtn" onclick="alert('Hello there!')">
        Click
    </button>

</body>
</html>

HTML 文件包含一个显示警报对话框的按钮。

Program.cs
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;
using SeleniumExtras.WaitHelpers;

var driver = new EdgeDriver();

try
{
    var url = "file://C:/Users/Jano/Documents/prog/csharp/selenium/Click/index.html";
    driver.Url = url;

    var button = driver.FindElement(By.Id("mybtn"));
    button.Click();
    Thread.Sleep(1500);

    try {
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        wait.Until(ExpectedConditions.AlertIsPresent());

        var alert = driver.SwitchTo().Alert();
        var text = alert.Text;
        Console.WriteLine(text);

        alert.Accept();

    } catch (TimeoutException e) {

        Console.WriteLine(e);
    }

}
finally
{
    driver.Quit();
}

我们从本地文件系统获取 HTML 文件。 该示例在完整浏览器模式下运行。

var url = "file://C:/Users/Jano/Documents/prog/csharp/selenium/Click/index.html";
driver.Url = url;

我们定位 HTML 文件。

var button = driver.FindElement(By.Id("mybtn"));
button.Click();
Thread.Sleep(1500);

我们找到按钮并使用 Click 按下它。 我们使用 Thread.Sleep 添加一些延迟,以便我们可以观看该过程。

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.AlertIsPresent());

我们等待直到警报对话框弹出。

var alert = driver.SwitchTo().Alert();
var text = alert.Text;
Console.WriteLine(text);

我们检索警报的文本。

C# Selenium 提交表单

在下一个示例中,我们提交一个表单并检查响应文本。

Tests.cs
using NUnit.Framework;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;
using SeleniumExtras.WaitHelpers;

namespace SubmitForm;

public class Tests
{
    private string url = "http://webcode.me/submit/";
    private IWebDriver driver;

    [SetUp]
    public void Setup()
    {
        var eo = new EdgeOptions();
        eo.AddArgument("headless");

        driver = new EdgeDriver(eo);
    }

    [Test]
    public void Test1()
    {
        driver.Url = url;

        var form = driver.FindElement(By.TagName("form"));
        var name = driver.FindElement(By.Name("name"));
        var message = driver.FindElement(By.Name("message"));

        name.SendKeys("John Doe");
        message.SendKeys("Hello!");

        form.Submit();

        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
        wait.Until(ExpectedConditions.UrlContains("message.php"));

        var content = driver.FindElement(By.TagName("body")).Text;
        // TestContext.Out.WriteLine(content);

        Assert.That(content, Does.Contain("John Doe says: Hello!"));
    }

    [TearDown]
    public void TearDown() => driver.Quit();
}

我们填写两个输入标签并提交表单。 我们检索响应消息。

var form = driver.FindElement(By.TagName("form"));
var name = driver.FindElement(By.Name("name"));
var message = driver.FindElement(By.Name("message"));

定位了三个标签:一个表单和两个输入框。

name.SendKeys("John Doe");
message.SendKeys("Hello!");

我们使用 SendKeys 将数据设置到输入框中。

form.Submit();

表单通过 Submit 提交。

var content = driver.FindElement(By.TagName("body")).Text;

我们从响应中获取消息。

Assert.That(content, Does.Contain("John Doe says: Hello!"));

断言检查预期返回值。

来源

欢迎使用 Selenium .NET API 文档

在本文中,我们使用了 C# 中的 Selenium Web 测试框架。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程