Selenium C#中使用JSON文件实现测试数据驱动登录自动化的问题求助
解决Selenium C#中从JSON读取登录凭证的编译错误
核心问题分析
- JSON格式无效:
login.json包含两个独立的顶级JSON对象,不符合JSON语法规范(JSON只能有一个顶级元素),同时键名不统一(Username1、Username2),导致无法正确解析。 - 类型不匹配:登录方法中用
List<string>接收用户名,但SendKeys方法需要传入string类型,直接传递列表触发编译错误;且Password变量未从JSON中获取值。 - 缺少字符串读取方法:
CredentialReader类仅提供整数和数组的读取方法,没有读取单个字符串的方法,无法直接获取用户名、密码这类单值数据。
分步解决方案
1. 修正JSON文件结构
将多组登录凭证改为JSON数组结构,统一键名,确保格式合法:
[ { "Username": "Test_PM", "Password": "Password123" }, { "Username": "Test_Viewing", "Password": "Password123" } ]
2. 扩展CredentialReader类
添加读取单个字符串的方法,以及读取多组登录凭证的方法(需引入Newtonsoft.Json库):
using System; using System.Collections.Generic; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class CredentialReader { public static string GetProjectRootDirectory() { string currentDirectory = Directory.GetCurrentDirectory(); return currentDirectory.Split("bin")[0]; } private static JObject GetTestDataJsonObject() { string path = Path.Combine(GetProjectRootDirectory(), "TestData", "login.json"); JObject jObject = JObject.Parse(File.ReadAllText(path)); return jObject; } public static int GetTestDataInt(string label) { var jObject = GetTestDataJsonObject(); return int.Parse(jObject[label].ToString()); } public static List<string> GetTestDataArray(string label) { var jObject = GetTestDataJsonObject(); return jObject[label].ToObject<List<string>>(); } // 新增:读取单个字符串 public static string GetTestDataString(string label) { var jObject = GetTestDataJsonObject(); return jObject[label]?.ToString() ?? string.Empty; } // 新增:读取多组登录凭证(配合修正后的JSON数组) public static List<LoginCredential> GetLoginCredentials() { string path = Path.Combine(GetProjectRootDirectory(), "TestData", "login.json"); string jsonContent = File.ReadAllText(path); return JsonConvert.DeserializeObject<List<LoginCredential>>(jsonContent); } } // 新增:登录凭证实体类 public class LoginCredential { public string Username { get; set; } public string Password { get; set; } }
3. 修改登录方法
根据需求选择单凭证或多凭证读取方式,确保类型匹配:
internal void EnterLoginDetails() { // 方式1:读取单组凭证(若JSON改为单对象结构) // string username = CredentialReader.GetTestDataString("Username"); // string password = CredentialReader.GetTestDataString("Password"); // 方式2:读取多组凭证,取第一组示例 var loginCredentials = CredentialReader.GetLoginCredentials(); string username = loginCredentials[0].Username; string password = loginCredentials[0].Password; txtUserName.SendKeys(username); txtPassword.SendKeys(password); btnLogin.Click(); }
内容的提问来源于stack exchange,提问作者majasmin
相关产品推荐
相关产品推荐

