![](/img/trans.png)
[英]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.