簡體   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