繁体   English   中英

使用 Selenium WebDriver C# 和带有值的 Web 表单读取 Excel 文件

[英]Reading Excel file with Selenium WebDriver C# and web form with values

我有一个用 C# 编写的 Selenium WebDriver 脚本,它从 Excel 电子表格中读取一些值,然后使用行中的值来填充 Web 表单。 我现在面临的挑战是它从 Excel 文件中获取第一个单元格值并将其输入到表单中的所有字段,然后获取下一个值并执行相同的操作,依此类推。

我怎样才能使它采用第一个值,添加到表单中的第一个(命名字段),获取第二个值和第二个命名字段,依此类推。

请参阅下面的方法代码。

public void FillForm()
//Function reads entries from an Excel spreadsheet then uses values to populate and fill the form
{

    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    Excel.Range xlrange;

    string xlString;
    int xlRowCnt = 0;
    int xlColCnt = 0;

    xlApp = new Excel.Application();
    //Open Excel file
    xlWorkBook = xlApp.Workbooks.Open(@"D:\Projects\Data\MSI_Data_file.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

    //This gives the used cells in the sheet

    xlrange = xlWorkSheet.UsedRange;


    for (xlRowCnt = 1; xlRowCnt <= xlrange.Rows.Count; xlRowCnt++)
    {
        for (xlColCnt = 1; xlColCnt <= xlrange.Columns.Count; xlColCnt++)
        {
            xlString = (string)(xlrange.Cells[xlRowCnt, xlColCnt] as Excel.Range).Value2;
            driver.FindElement(By.XPath("//input[contains(@name, 'FirmName')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'FirstName')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'LastName')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'Email')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'FirmAddress')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//select[@id= 'ddlCountry']")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'PhoneNumber')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'FaxNumber')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[contains(@name, 'Website')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//textarea[contains(@name, 'Comments')]")).SendKeys(xlString);
            driver.FindElement(By.XPath("//input[@id='chkFirm_Service_Accounting']")).Click();
            driver.FindElement(By.XPath("//select[contains(@name, 'LeadSource')]")).SendKeys(xlString);

            //save screenshot of completed form
            SaveScreenShot("CompleteForm");

            driver.FindElement(By.XPath("//a[contains(text(), 'Submit')]")).Click();

            //Take screenshot of successful form submission
            SaveScreenShot("Submission_Success");


            driver.FindElement(By.XPath("//a[contains(text(), 'click here')]")).Click();

        }
    }
}

您应该一次处理每一列以执行 FindElement。 我已经修改了您的代码并使其更加灵活。

首先,您注意到我通过为每个表达式引入了一个 Lamba 函数来概括您使用的 XPath 表达式:

Func<string,string> inputName = (id) => String.Format("//input[contains(@name, '{0}')]", id);

当我们将列映射到正确的 XPath 时,我们可以稍后重用这些。 正如你在最终代码中看到的那样,我有 5 个。

接下来,我添加了一个简单的List<string>来保存 Excel 中的每一列要使用的字段:

var fields = new List<string> {
    inputName("FirmName"),
    inputName("FirstName"),
    // many more
 }

因此,第一列将与您的网络表单上名为FirmName 的输入元素匹配,第二列将与Firstname等匹配。

请注意,在 Excel 表中实现此映射并不太难,因此可以进一步概括此代码,但我将其作为练习留给读者。

一旦我们有了我们的fields我们就可以通过对List<string> 索引器进行简单调用来简单地为每一列获取要使用的 XPath:

// this will give you the correct XPath
var xpath = fields[xlColCnt -1]; 

唯一需要注意的是,在 Excel 中,列从 1 开始,而在 C# 中,一般索引从 0 开始,因此是 -1。

将它们放在一起将为您提供最终的实现:

public void FillForm()
//Function reads entries from an Excel spreadsheet then uses values to populate and fill the form
{

    string xlString;
    int xlRowCnt = 0;
    int xlColCnt = 0;

    var xlApp = new Application();
    //Open Excel file
    var xlWorkBook = xlApp.Workbooks.Open(@"MSI_Data_file.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
    var xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);

    //This gives the used cells in the sheet

    var xlrange = xlWorkSheet.UsedRange;

    // XPath formatters for each 
    Func<string,string> inputName = (id) => String.Format("//input[contains(@name, '{0}')]", id);
    Func<string, string> inputId = (id) => String.Format("//input[@id='{0}']", id);
    Func <string, string> selectId = (id) => String.Format("//select[@id= '{0}']", id);
    Func<string, string> selectName = (id) => String.Format("//select[contains(@name, '{0}')]", id);
    Func<string, string> textareaName = (id) => String.Format("//textarea[contains(@name, '{0}')]", id);

    // map a fieldname to an Xpath formatter
    // Order of the fields is important!
    var fields = new List<string> {
        inputName("FirmName"),
        inputName("FirstName"),
        inputName("LastName"),
        inputName("Email"),
        inputName("FirmAddress"),
        selectId("ddlCountry"),
        inputName("PhoneNumber"),
        inputName("FaxNumber"),
        inputName("Website"),
        textareaName("Comments"),
        inputId("chkFirm_Service_Accounting"),
        selectName("LeadSource"),
    };
    // handle all rows
    for (xlRowCnt = 1; xlRowCnt <= xlrange.Rows.Count; xlRowCnt++)
    {
        // handle each column, based on the column number
        for (xlColCnt = 1; xlColCnt <= xlrange.Columns.Count; xlColCnt++)
        {
            var value = xlrange.Cells[xlRowCnt, xlColCnt].Value2;
            // if value contains a double or a date, this will still work
            xlString = (value ?? "").ToString();

            // this will give you the correct XPath
            var xpath = fields[xlColCnt -1]; 
            // find 
            driver.FindElement(By.XPath(xpath)).SendKeys(xlString);
        }

        //save screenshot of completed form
        SaveScreenShot("CompleteForm");
        driver.FindElement(By.XPath("//a[contains(text(), 'Submit')]")).Click();
        //Take screenshot of successful form submission
        SaveScreenShot("Submission_Success");
        driver.FindElement(By.XPath("//a[contains(text(), 'click here')]")).Click();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM