Selenium C#从Excel读取数据以进行数据驱动测试时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium C#从Excel读取数据以进行数据驱动测试时出错相关的知识,希望对你有一定的参考价值。
我试图通过从Excel文件加载客户端代码到登录并执行其他操作来执行数据驱动测试。我正在尝试为client_code列中的所有客户端迭代我的测试。我只需要读取client_code列并获取数据以与这些客户端重复相同的测试。当我在代码下面运行时,我得到Null值
任何帮助都将非常感谢谢谢。
我正在使用ExcelDataReader v3.4.0,ExcelDataReader.DataSet v3.4.0,selenium Webdriver v3.11.0
我的Excel表格如下所示。
client_code client_name
11111 Client1
22222 Client2
33333 Client3
44444 Client4
55555 Client5
这是我的代码:
ExcelUtil.cs
using ExcelDataReader;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
namespace MyDemoAutomation
{
public class ExcelUtil
{
public DataTable ExcelToDatable(string fileName)
{
// open file and returns as stream
FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read);
// create openXmlReader via ExcelReaderFactory
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//Set the first row as column name
var result1 = excelReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
});
// Return as dataset
DataSet result = excelReader.AsDataSet();
// Get all tables
DataTableCollection table = result.Tables;
// Store in Database
DataTable resultTable = table["Sheet1"];
// return
return resultTable;
}
List<DataCollection> dataCol = new List<DataCollection>();
public void PopulateInCollection(string fileName)
{
DataTable table = ExcelToDatable(fileName);
for (int row = 1; row <= table.Rows.Count; row++)
{
for (int col = 0; col < table.Columns.Count; col++)
{
DataCollection dtTable = new DataCollection()
{
rowNumber = row,
colName = table.Columns[col].ColumnName,
colValue = table.Rows[row - 1][col].ToString()
};
dataCol.Add(dtTable);
}
}
}
public string ReadData(int rowNumber, string columnName)
{
try
{
// Retriving data using LINQ to reduce much of iterations
string data = (from colData in dataCol
where colData.colName == columnName && colData.rowNumber == rowNumber
select colData.colValue).SingleOrDefault();
return data.ToString();
}
catch (Exception e)
{
return null;
}
}
internal class DataCollection
{
public int rowNumber { get; internal set; }
public string colName { get; internal set; }
public string colValue { get; internal set; }
}
}
}
测试类:
[Test]
public void DataDrivenTest_FromExcel()
{
Driver = new ChromeDriver();
ExcelUtil util = new ExcelUtil();
util.PopulateInCollection(@"C:danAutomationTestTestData est.xlsx");
Driver.FindElement(By.Id("contentPlaceholder_txtClientCode")).SendKeys(util.ReadData(i));
Driver.FindElement(By.XPath("//*[@id='btnLogin']")).Click();
Driver.FindElement(By.XPath("//*[@id='tabContent0']/table/tbody/tr[2]/td[1]")).Click();
Driver.FindElement(By.Id("contentPlaceholder_txtcloseButton")).Click();
Driver.Quit
}
答案
您可以:
阅读EXCEL文件:
class ExcelReader
{
public List<TestCaseData> ReadExcelData(string excelFile, string sheetname)
{
string cmdText = "SELECT * FROM [" + sheetname+ "$]";
if (!File.Exists(excelFile))
throw new Exception(string.Format("File name: {0}", excelFile), new
FileNotFoundException());
string connectionStr =
string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES";", excelFile);
var ret = new List<TestCaseData>();
using (var connection = new OleDbConnection(connectionStr))
{
connection.Open();
var command = new OleDbCommand(cmdText, connection);
var reader = command.ExecuteReader();
if (reader == null)
throw new Exception(string.Format("No data return from file,
file name:{0}", excelFile));
while (reader.Read())
{
var row = new List<string>();
var feildCnt = reader.FieldCount;
for (var i = 0; i < feildCnt; i++)
row.Add(reader.GetValue(i).ToString());
ret.Add(new TestCaseData(row.ToArray()));
}
}
return ret;
}
您的测试用例将保持如下:
[TestFixture]
class TC_1
{
public static IEnumerable<TestCaseData> BudgetData
{
get
{
List<TestCaseData> testCaseDataList = new ExcelReader().ReadExcelData(//path//document.xlsx",
"SheetName");
if (testCaseDataList != null)
foreach (TestCaseData testCaseData in testCaseDataList)
yield return testCaseData;
}
}
[Test]
[TestCaseSource(typeof(TC_1), "BudgetData")]
public void TestCase1(string attribbutte1, string .....)
{
........................................
注意:您需要将“Access Database Engine”引用安装到“读取Excel文件”
注2:默认情况下,第一行将是标题,对于TC将执行的每个新行
相同的代码执行5次更改数据
另一答案
您好@Miguel D'Alessio我尝试运行您提供的代码。下面是我运行时出错的精确复制粘贴代码。谢谢。
ExcelReader类:
namespace Automation
{
class ExcelReader
{
public List<TestCaseData> ReadExcelData(string excelFile, string sheetname)
{
string cmdText = "SELECT * FROM [" + sheetname + "$]";
if (!File.Exists(excelFile))
throw new Exception(string.Format("File name: {0}", excelFile), new
FileNotFoundException());
string connectionStr =
string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES";", excelFile);
var ret = new List<TestCaseData>();
using (var connection = new OleDbConnection(connectionStr))
{
connection.Open();
var command = new OleDbCommand(cmdText, connection);
var reader = command.ExecuteReader();
if (reader == null)
throw new Exception(string.Format("No data return from file, file name:{ 0 }", excelFile));
while (reader.Read())
{
var row = new List<string>();
var feildCnt = reader.FieldCount;
for (var i = 0; i < feildCnt; i++)
row.Add(reader.GetValue(i).ToString());
ret.Add(new TestCaseData(row.ToArray()));
}
}
return ret;
}
}
}
以上是关于Selenium C#从Excel读取数据以进行数据驱动测试时出错的主要内容,如果未能解决你的问题,请参考以下文章
Selenium3+Python3_15:数据驱动ddt+excel
python+selenium+new——xlrd库——读取excel文件——xls结尾为示例 ——数据格式