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将执行的每个新行

enter image description here

相同的代码执行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

R语言读写excel文件2021.2.24

python+selenium+new——xlrd库——读取excel文件——xls结尾为示例 ——数据格式

如何在java和selenium中读取excel中的浮点值

Selenium——selenium之利用excel实现参数化

从 Excel 中逐行读取参数以进行 Anylogic 实验