欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET操作瀏覽器執(zhí)行JS的方法步驟

 更新時(shí)間:2025年09月22日 10:19:56   作者:墨瑾軒  
Selenium WebDriver是用于Web應(yīng)用程序測試的強(qiáng)大工具,它可以直接與瀏覽器進(jìn)行通信,就像用戶在本地或遠(yuǎn)程機(jī)器上操作一樣,WebDriver支持多種編程語言綁定,如Java、Python、C#等,所以本文給大家介紹了.NET操作瀏覽器執(zhí)行JS的方法步驟,需要的朋友可以參考下

前言

你是否遇到過這些痛點(diǎn):

  • 頁面加載太慢?
  • 元素定位失敗?
  • 無法操作動態(tài)內(nèi)容?

答案就是Selenium WebDriver + JavaScript注入!通過直接執(zhí)行JavaScript代碼,.NET程序的瀏覽器操作效率可以實(shí)現(xiàn)300%的飛躍。本文將用3大核心技巧+2個(gè)實(shí)戰(zhàn)案例,手把手教你從零掌握J(rèn)avaScript注入的“核武器”,讓你的自動化測試像火箭一樣飛!

Selenium WebDriver vs 傳統(tǒng)點(diǎn)擊:一場效率的“軍備競賽”

1. 傳統(tǒng)點(diǎn)擊的“三座大山”

  • 時(shí)間復(fù)雜度高:如Click()方法需等待DOM加載
  • 元素定位失敗:動態(tài)ID導(dǎo)致的NoSuchElementException
  • 無法操作隱藏元素:如未渲染的SVG或Canvas內(nèi)容

對比傳統(tǒng)點(diǎn)擊 vs JavaScript注入

方式優(yōu)點(diǎn)局限性
傳統(tǒng)點(diǎn)擊實(shí)現(xiàn)簡單依賴DOM穩(wěn)定性
JavaScript注入高效靈活需要JavaScript知識

2. JavaScript注入的“黃金法則”

  • 直接操作DOM:繞過Selenium的元素查找邏輯
  • 觸發(fā)事件模擬:如click()、change()事件
  • 異步執(zhí)行優(yōu)化:通過ExecuteAsync處理延遲加載內(nèi)容

3大核心技巧:JavaScript注入的“核武器”

技巧1:直接操作DOM——從點(diǎn)擊到賦值的革命

案例:百度搜索框輸入“Selenium WebDriver”

傳統(tǒng)點(diǎn)擊

var searchBox = driver.FindElement(By.Id("kw"));
searchBox.SendKeys("Selenium WebDriver");
var submitButton = driver.FindElement(By.Id("su"));
submitButton.Click();

JavaScript注入

((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('kw').value = 'Selenium WebDriver';");
((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('su').click();");
  • 性能對比
    • 傳統(tǒng)點(diǎn)擊:需等待元素加載,耗時(shí)約200ms
    • JavaScript注入:直接操作DOM,耗時(shí)約50ms

技巧2:觸發(fā)事件模擬——讓隱藏元素“現(xiàn)身”

案例:觸發(fā)下拉菜單的change事件

傳統(tǒng)點(diǎn)擊

var dropdown = driver.FindElement(By.Id("myDropdown"));
dropdown.Click();
var option = driver.FindElement(By.XPath("http://option[@value='2']"));
option.Click();

JavaScript注入

var dropdown = driver.FindElement(By.Id("myDropdown"));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].value = '2';", dropdown);
((IJavaScriptExecutor)driver).ExecuteScript("new Event('change', { bubbles: true });", dropdown);
  • 性能對比
    • 傳統(tǒng)點(diǎn)擊:需等待選項(xiàng)渲染,可能失敗
    • JavaScript注入:直接賦值并觸發(fā)事件,100%成功

技巧3:異步執(zhí)行優(yōu)化——處理延遲加載內(nèi)容

案例:等待動態(tài)加載的圖片

傳統(tǒng)等待

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => d.FindElement(By.Id("myImage")).Displayed);

JavaScript注入

((IJavaScriptExecutor)driver).ExecuteAsyncScript(@"
    var callback = arguments[arguments.length - 1];
    var img = document.getElementById('myImage');
    if (img.complete) {
        callback('loaded');
    } else {
        img.onload = function() { callback('loaded'); };
    }
");
  • 性能對比
    • 傳統(tǒng)等待:固定超時(shí)時(shí)間,可能浪費(fèi)資源
    • JavaScript注入:實(shí)時(shí)檢測加載狀態(tài),精準(zhǔn)控制

2個(gè)實(shí)戰(zhàn)案例:從卡頓到絲滑的JavaScript飛躍

場景1:百度搜索自動化

需求:自動輸入關(guān)鍵詞并截圖

完整代碼

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;

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

        // 設(shè)置JavaScript執(zhí)行超時(shí)時(shí)間
        driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(20);

        // 執(zhí)行JavaScript輸入和點(diǎn)擊
        ((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('kw').value = 'Selenium WebDriver';");
        ((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('su').click();");

        // 等待頁面加載
        System.Threading.Thread.Sleep(2000);

        // 截圖保存
        Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();
        screenshot.SaveAsFile("E:/baidu.png", ScreenshotImageFormat.Png);

        driver.Quit();
    }
}
  • 效果
    • 無需等待元素加載,直接操作DOM
    • 截圖速度提升3倍

場景2:動態(tài)內(nèi)容加載處理

需求:等待圖片加載完成后再截圖

完整代碼

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;

class Program
{
    static void Main(string[] args)
    {
        ChromeDriver driver = new ChromeDriver();
        driver.Navigate().GoToUrl("https://example.com/dynamic-image");

        // 使用JavaScript等待圖片加載
        ((IJavaScriptExecutor)driver).ExecuteAsyncScript(@"
            var callback = arguments[arguments.length - 1];
            var img = document.getElementById('dynamicImage');
            if (img.complete) {
                callback('loaded');
            } else {
                img.onload = function() { callback('loaded'); };
            }
        ");

        // 截圖保存
        Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();
        screenshot.SaveAsFile("E:/dynamic.png", ScreenshotImageFormat.Png);

        driver.Quit();
    }
}
  • 效果
    • 精準(zhǔn)等待圖片加載完成
    • 避免因圖片未加載導(dǎo)致的截圖失敗

你可能踩過的“坑”:3個(gè)致命誤區(qū)

誤區(qū)1:忽略瀏覽器與WebDriver版本匹配

錯(cuò)誤示例

// 使用舊版ChromeDriver操作新版Chrome瀏覽器
ChromeDriver driver = new ChromeDriver(); // 可能報(bào)錯(cuò)

正確做法

// 通過NuGet安裝對應(yīng)版本的Selenium.Chrome.WebDriver
Install-Package Selenium.Chrome.WebDriver -Version 75.0.0

誤區(qū)2:錯(cuò)誤使用Execute方法

錯(cuò)誤示例

driver.Execute("document.getElementById('kw').value = 'Selenium';"); // 編譯錯(cuò)誤

正確做法

((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('kw').value = 'Selenium';");

誤區(qū)3:忽略異步腳本的回調(diào)處理

錯(cuò)誤示例

driver.ExecuteAsyncScript("setTimeout(function() { alert('Done'); }, 2000);"); // 無返回值

正確做法

var result = driver.ExecuteAsyncScript(@"
    var callback = arguments[arguments.length - 1];
    setTimeout(function() { callback('Done'); }, 2000);
");
Console.WriteLine(result); // 輸出 "Done"

給開發(fā)者的終極建議

  1. 優(yōu)先JavaScript注入:對動態(tài)內(nèi)容或隱藏元素操作時(shí),優(yōu)先使用JavaScript
  2. 善用異步腳本:通過ExecuteAsyncScript處理延遲加載內(nèi)容
  3. 版本嚴(yán)格匹配:確保瀏覽器和WebDriver版本一致(可通過NuGet管理)
  4. 調(diào)試工具輔助:使用Chrome DevTools Protocol進(jìn)行深度調(diào)試
  5. 異常處理:為JavaScript注入添加try-catch邏輯

最后說點(diǎn)掏心窩的話

我曾為一個(gè)動態(tài)加載的圖片等待問題熬了3個(gè)通宵,直到發(fā)現(xiàn)“JavaScript注入+異步回調(diào)”的奧秘才柳暗花明。記住:沒有銀彈。JavaScript注入的價(jià)值在于你如何用它——是用于精準(zhǔn)控制還是繼續(xù)暴力點(diǎn)擊,取決于你的初心。

以上就是.NET操作瀏覽器執(zhí)行JS的方法步驟的詳細(xì)內(nèi)容,更多關(guān)于.NET操作瀏覽器執(zhí)行JS的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# char[]與string byte[]與string之間的轉(zhuǎn)換詳解

    C# char[]與string byte[]與string之間的轉(zhuǎn)換詳解

    在本篇文章里小編給大家分享的是關(guān)于C# char[]與string byte[]與string之間的轉(zhuǎn)換的知識點(diǎn)內(nèi)容,需要的朋友們參考下
    2019-11-11
  • C#條件拼接Expression<Func<T, bool>>的使用

    C#條件拼接Expression<Func<T, bool>>的使用

    本文主要介紹了C#條件拼接Expression<Func<T, bool>>的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#數(shù)據(jù)結(jié)構(gòu)之最小堆的實(shí)現(xiàn)方法

    C#數(shù)據(jù)結(jié)構(gòu)之最小堆的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#數(shù)據(jù)結(jié)構(gòu)之最小堆的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C#利用waveIn實(shí)現(xiàn)聲音采集

    C#利用waveIn實(shí)現(xiàn)聲音采集

    wimm這種基于win32 api的庫,完全可以直接用C#去調(diào)用,將依賴減少到最小,所以本文小編就來和大家介紹一下C#如何使用waveIn實(shí)現(xiàn)聲音采集,感興趣的小伙伴可以了解下
    2023-10-10
  • C#?WPF中RadioButton控件的用法及應(yīng)用場景

    C#?WPF中RadioButton控件的用法及應(yīng)用場景

    在WPF應(yīng)用程序中,RadioButton控件是一種常用的用戶界面元素,本文主要介紹了C#?WPF中RadioButton控件的用法及應(yīng)用場景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Unity3D UI Text得分?jǐn)?shù)字增加的實(shí)例代碼

    Unity3D UI Text得分?jǐn)?shù)字增加的實(shí)例代碼

    這篇文章主要介紹了Unity3D UI Text得分?jǐn)?shù)字增加方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Unity給物體添加多個(gè)Tag的實(shí)現(xiàn)

    Unity給物體添加多個(gè)Tag的實(shí)現(xiàn)

    這篇文章主要介紹了Unity給物體添加多個(gè)Tag的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 利用C#實(shí)現(xiàn)記事本的功能的示例代碼

    利用C#實(shí)現(xiàn)記事本的功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)簡單的記事本的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C# BackgroundWorker組件學(xué)習(xí)入門介紹

    C# BackgroundWorker組件學(xué)習(xí)入門介紹

    一個(gè)程序中需要進(jìn)行大量的運(yùn)算,并且需要在運(yùn)算過程中支持用戶一定的交互,為了獲得更好的用戶體驗(yàn),使用BackgroundWorker來完成這一功能
    2013-10-10
  • C# .NET 中的緩存實(shí)現(xiàn)詳情

    C# .NET 中的緩存實(shí)現(xiàn)詳情

    軟件開發(fā)中最常用的模式之一是 緩存 ,其包括進(jìn)程內(nèi)緩存、持久性進(jìn)程內(nèi)緩存和分布式緩存,本文我們將主要介紹進(jìn)程內(nèi)緩存,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09

最新評論