• 如何使用Selenium WebDriver实现网站自动化测试
  • 发布于 1周前
  • 28 热度
    0 评论
简介
在 .NET 中,使用 Selenium WebDriver 不仅可以操作浏览器,还可以直接在浏览器中执行 JavaScript 代码。通过 WebDriver 提供的 IJavaScriptExecutor 接口,开发者能够运行自定义 JavaScript 脚本并获取执行结果。这一功能对实现网站自动化测试和操作非常有帮助。

本文将详细介绍以下内容:
1.如何在 .NET 中使用 Selenium WebDriver 驱动浏览器(如 Chrome、IE、Firefox)。

2.通过 ExecuteAsyncScript 方法在后台执行 JavaScript 代码的具体实现。


一. 安装 Selenium WebDriver

注意事项:确保已安装待操作的浏览器,并保证其版本与 Selenium.WebDriver 对应的 NuGet 包版本一致。


本文以 Chrome 浏览器为例,若需操作其他浏览器,请安装相应的 NuGet 包。
安装步骤
打开 Visual Studio,使用 NuGet 包管理器搜索以下包并安装:
Selenium.WebDriver
Selenium.Chrome.WebDriver
或者使用以下命令通过 Package Manager Console 安装:
Install-Package Selenium.WebDriver
Install-Package Selenium.Chrome.WebDriver -Version 75.0.0
参考文档:如何在 Visual Studio 中使用 NuGet 管理器。

二. 使用 Selenium WebDriver 执行 JavaScript
以下示例展示如何通过 Selenium WebDriver 驱动 Chrome 浏览器并使用 JavaScript 执行自动化操作,例如在百度首页进行搜索。
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Threading;

namespace SeleniumExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化 ChromeDriver
            ChromeDriver driver = new ChromeDriver();
            driver.Navigate().GoToUrl("https://www.baidu.com");

            // 设置 JavaScript 执行的超时时间
            driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(20);

            // 使用 JavaScript 输入关键字并点击按钮
            driver.ExecuteScript("document.getElementById('kw').value = 'Selenium WebDriver';");
            driver.ExecuteScript("document.getElementById('su').click();");
             // 堆代码 duidaima.com
            // 等待页面加载
            Thread.Sleep(2000);

            // 网页截图保存到本地
            Screenshot screenshot = driver.GetScreenshot();
            screenshot.SaveAsFile("E:/baidu.png", ScreenshotImageFormat.Png);

            driver.Quit();
            Console.WriteLine("操作完成!");
        }
    }
}
三. 使用 ExecuteAsyncScript 执行 JavaScript
与 ExecuteScript 不同,ExecuteAsyncScript 可以异步执行 JavaScript 脚本,并通过回调函数通知完成状态。这在处理 AJAX 请求或复杂的异步任务时非常有用。
用法示例
浏览器中执行定时任务
driver.ExecuteAsyncScript(
    "window.setTimeout(arguments[arguments.length - 1], 500);");
上述代码通过 setTimeout 定时 500 毫秒后调用回调函数。

同步测试与 AJAX 应用程序
driver.ExecuteAsyncScript(
    "var callback = arguments[arguments.length - 1];" +
    "mailClient.getComposeWindowWidget().onload(callback);");
此代码等待 AJAX 加载完成后,回调函数 callback 通知脚本结束。
注入 XMLHttpRequest 并等待响应
Object response = driver.ExecuteAsyncScript(
    "var callback = arguments[arguments.length - 1];" +
    "var xhr = new XMLHttpRequest();" +
    "xhr.open('GET', '/resource/data.json', true);" +
    "xhr.onreadystatechange = function() {" +
    "  if (xhr.readyState == 4) {" +
    "    callback(xhr.responseText);" +
    "  }" +
    "};" +
    "xhr.send();");
Console.WriteLine($"响应数据: {response}");

在此示例中,使用 JavaScript 发起异步 HTTP 请求并返回结果。


总结
通过 Selenium WebDriver 的 IJavaScriptExecutor 接口,开发者可以在浏览器中灵活地执行 JavaScript 脚本,实现自动化操作和复杂的异步任务。无论是简单的 DOM 操作,还是结合 AJAX 技术的深度自动化,ExecuteScript 和 ExecuteAsyncScript 都是非常强大的工具。

用户评论