2.通过 ExecuteAsyncScript 方法在后台执行 JavaScript 代码的具体实现。
注意事项:确保已安装待操作的浏览器,并保证其版本与 Selenium.WebDriver 对应的 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 管理器。
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
driver.ExecuteAsyncScript( "window.setTimeout(arguments[arguments.length - 1], 500);");上述代码通过 setTimeout 定时 500 毫秒后调用回调函数。
driver.ExecuteAsyncScript( "var callback = arguments[arguments.length - 1];" + "mailClient.getComposeWindowWidget().onload(callback);");此代码等待 AJAX 加载完成后,回调函数 callback 通知脚本结束。
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 请求并返回结果。