[英]How to write data into an Excel file using Selenium WebDriver with C#?
[英]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.