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
相关产品推荐
相关产品推荐

