You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium调用SendKeys发送键盘事件时如何替换Switch/Case分支实现

实现思路

核心逻辑是通过反射获取OpenQA.Selenium.Keys类中与输入keyName同名的静态字段,拿到对应的按键值后直接传入SendKeys方法即可,完全不需要硬写switch分支。

具体实现步骤

  • 首先通过typeof(Keys)拿到Selenium按键类的类型元数据
  • 调用GetField()方法匹配和keyName同名的公共静态字段,可指定不区分大小写兼容更多输入场景
  • 匹配到字段后调用GetValue(null)获取静态字段对应的按键字符串值,直接传入发送按键的逻辑即可
  • 未匹配到字段的分支对应原来的default逻辑,可根据需求自定义日志输出或者异常抛出规则

代码示例

using OpenQA.Selenium;
using OpenQA.Selenium.Interactions;
using System.Reflection;

public void SendKeyByName(IWebDriver driver, string keyName)
{
    // 反射获取对应按键的字段信息
    FieldInfo keyField = typeof(Keys).GetField(keyName, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
    if (keyField == null)
    {
        // 对应原default分支,可按需调整逻辑
        Console.WriteLine("TBD");
        return;
    }
    // 获取按键值执行发送
    string keyValue = keyField.GetValue(null) as string;
    new Actions(driver).SendKeys(keyValue).Perform();
}

性能优化方案

如果调用频率较高,可以加一层静态缓存避免每次调用都走反射:

private static readonly Dictionary<string, string> _keyCache = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

public void SendKeyByNameWithCache(IWebDriver driver, string keyName)
{
    if (!_keyCache.TryGetValue(keyName, out string keyValue))
    {
        FieldInfo keyField = typeof(Keys).GetField(keyName, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
        if (keyField == null)
        {
            Console.WriteLine("TBD");
            return;
        }
        keyValue = keyField.GetValue(null) as string;
        _keyCache.TryAdd(keyName, keyValue);
    }
    new Actions(driver).SendKeys(keyValue).Perform();
}

内容的提问来源于stack exchange,提问作者Shmulik b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:24:08