2013-08-26 56 views
0

如何让Selenium webdriver读取csv文件以执行操作。我有我的脚本加载它在浏览器中,并执行一个操作如何让它读取CSV文件,并用csv文件中的数据替换该操作如何让Selenium webdriver读取csv文件以执行操作

+0

你能后的脚本示例

WebElement username = driver.findElement(By.id("username")); username.sendKeys(Utility.getSheetData("Login.xls",0,1,0)); 

快乐? SO不是一个完整教程的地方 - 更多的资源可以帮助你解决你的问题。 – vroomfondel

+0

硒与硒无关。 Selenium不解析CSV文件。你编码的语言具有这种能力。 – Arran

回答

0

这样做的最好方法是使用另一个库专门研究这种解析,并将其馈入内存。一个好的StackOverflow关于这个问题是here

0

请记住,WebDriver只是简单地与浏览器交互。这就是你写作IO的语言。我建议创建一个CSV类。由于csv只是一个文本文件,因此您可以将其作为字符串读取并遍历每行。用逗号分开,你很好走。你没有指定一种语言,所以这里是我们库中C#的例子。注意我使用收益来提高效率。这是我在某处找到的东西。没有必要重新发明轮子。

public static class CSV 
{ 
    private static bool ignoreFirstLineDefault = false; 

    public static IEnumerable<IList<string>> FromFile(string fileName) 
    { 
     foreach (IList<string> item in FromFile(fileName, ignoreFirstLineDefault)) yield return item; 
    } 

    public static IEnumerable<IList<string>> FromFile(string fileName, bool ignoreFirstLine) 
    { 
     using (StreamReader rdr = new StreamReader(fileName)) 
     { 
      foreach (IList<string> item in FromReader(rdr, ignoreFirstLine)) yield return item; 
     } 
    } 

    public static IEnumerable<IList<string>> FromStream(Stream csv) 
    { 
     foreach (IList<string> item in FromStream(csv, ignoreFirstLineDefault)) yield return item; 
    } 

    public static IEnumerable<IList<string>> FromStream(Stream csv, bool ignoreFirstLine) 
    { 
     using (var rdr = new StreamReader(csv)) 
     { 
      foreach (IList<string> item in FromReader(rdr, ignoreFirstLine)) yield return item; 
     } 
    } 

    public static IEnumerable<IList<string>> FromReader(TextReader csv) 
    { 
     //Probably should have used TextReader instead of StreamReader 
     foreach (IList<string> item in FromReader(csv, ignoreFirstLineDefault)) yield return item; 
    } 

    public static IEnumerable<IList<string>> FromReader(TextReader csv, bool ignoreFirstLine) 
    { 
     if (ignoreFirstLine) csv.ReadLine(); 

     IList<string> result = new List<string>(); 

     StringBuilder curValue = new StringBuilder(); 
     char c; 
     c = (char)csv.Read(); 
     while (csv.Peek() != -1) 
     { 
      switch (c) 
      { 
       case ',': //empty field 
        result.Add(""); 
        c = (char)csv.Read(); 
        break; 
       case '"': //qualified text 
       case '\'': 
        char q = c; 
        c = (char)csv.Read(); 
        bool inQuotes = true; 
        while (inQuotes && csv.Peek() != -1) 
        { 
         if (c == q) 
         { 
          c = (char)csv.Read(); 
          if (c != q) 
           inQuotes = false; 
         } 

         if (inQuotes) 
         { 
          curValue.Append(c); 
          c = (char)csv.Read(); 
         } 
        } 
        result.Add(curValue.ToString()); 
        curValue = new StringBuilder(); 
        if (c == ',') c = (char)csv.Read(); // either ',', newline, or endofstream 
        break; 
       case '\n': //end of the record 
       case '\r': 
        //potential bug here depending on what your line breaks look like 
        if (result.Count > 0) // don't return empty records 
        { 
         yield return result; 
         result = new List<string>(); 
        } 
        c = (char)csv.Read(); 
        break; 
       default: //normal unqualified text 
        while (c != ',' && c != '\r' && c != '\n' && csv.Peek() != -1) 
        { 
         curValue.Append(c); 
         c = (char)csv.Read(); 
        } 
        result.Add(curValue.ToString()); 
        curValue = new StringBuilder(); 
        if (c == ',') c = (char)csv.Read(); //either ',', newline, or endofstream 
        break; 
      } 

     } 
     if (curValue.Length > 0) //potential bug: I don't want to skip on a empty column in the last record if a caller really expects it to be there 
      result.Add(curValue.ToString()); 
     if (result.Count > 0) 
      yield return result; 

    } 
} 
+0

请指明你在哪找到它。来源是关键。 – Arran

+0

我知道。由于作者花时间考虑引用的逗号,我希望我记得我在哪里找到该解析器。无论如何,即使整个代码并不是我全部做的,我还是认为我会发布最后一堂课。 –

0

我建议你使用Excel文件而不是csv。在使用CSV时的限制是当你想在数据本身中使用分隔符','时,例如如果你有一个地址字段说Gyandeep Colony, B. No : - 1/5在这里','让你的代码破坏。

我做的读取数据的方法是使用我的工具代码

public class ExcelHandler { 

public static String getSheetData(String path,String sheetName, int col , int row) { 
    Workbook workbook; 
    String data = null; 
    try { 
     workbook = Workbook.getWorkbook(new File(path)); 
     Sheet sheet = workbook.getSheet(sheetName); 
     data = sheet.getCell(row,col).getContents(); 

    } catch (BiffException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

    return data; 

} 


public static String getSheetData(String path, int sheetNo, int col , int row) { 
    Workbook workbook; 
    String data = null; 
    try { 
     workbook = Workbook.getWorkbook(new File(path)); 
     Sheet sheet = workbook.getSheet(sheetNo); 
     data = sheet.getCell(row,col).getContents(); 

    } catch (BiffException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

    return data; 

} 

} 

我只是把这些方法无论我想在我的代码。

让我们编码:)

0
FileInputStream file = new FileInputStream(new File("C:\\testdata.xls")); 
    HSSFWorkbook workbook = new HSSFWorkbook(file); 

    HSSFSheet sheet = workbook.getSheetAt(0); 

for (int i=1; i <= sheet.getLastRowNum(); i++){ 

     String keyword = sheet.getRow(i).getCell(0).getStringCellValue(); 

     searchbox.sendKeys(keyword); 

     searchbox.submit();  

     driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS); 

} 

    workbook.close(); 
    file.close(); 
相关问题