我是硒测试的初学者.我写了这段代码,它可以工作,但是我需要用另一条csv行循环此测试.
我花了将近10个小时试图做到这一点.
我正在尝试做的情况:
> Web浏览器正在打开转到URL
>从第一行以CSV文件中的数据登录
>驱动程序正在重新启动,并且执行相同操作,但来自csv文件第二行的数据.
我还尝试过使用aftermethod / afterclass重新启动测试,但无法正常工作.
public class CSVdataread {
private WebDriver driver;
String baseUrl = "URL";
String CSV_file = "C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv";
@BeforeClass
public void openBrowser() {
System.setProperty("webdriver.chrome.driver","C:\\Users\\xxxxxxxxxxxx\\Desktop\\webdriver\\chromedriver.exe");
driver = new ChromeDriver();
driver.navigate().to("URL");
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}
@Test
public void verify_Search() throws InterruptedException,IOException {
CSVReader reader = new CSVReader(new FileReader(CSV_file));
String[] cell;
while((cell = reader.readNext()) != null)
for (int i = 0; i < 1; i++) {
String name = cell[i];
String email = cell[i + 1];
String baseUrl = "http://xxxxx.xxx/xxxx/";
driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
{
driver.quit();
}
}
}
}
首先,让我们从CSVReader和一些良好实践以及代码的可读性开始.在测试中,您将读取CSV数据并在测试中使用它们.读取数据不是测试的责任.测试应该已经提供了所有数据.它称为DataProvider.这个术语实际上在TestNG测试框架中使用,就像@ user861594建议的一样.
因此,您应该有一些东西可以为测试提供数据.但这已经是步骤2.由于您知道将从CSV文件逐行读取数据,因此您应该创建一个适当的类以从CSV读取数据.
这是一个例子:
public class CSVReader {
private static final String DEFAULT_SEPARATOR = ",";
private BufferedReader reader;
private List<String> lines;
public CSVReader(File file) throws FileNotFoundException {
this.reader = new BufferedReader(new FileReader(file));
lines = this.reader.lines().collect(Collectors.toList());
}
public String[] getRow(int rowNumber) {
return lines.get(rowNumber).split(DEFAULT_SEPARATOR);
}
public int getRowCount() {
return lines.size();
}
}
CSVReader构造函数接受File作为参数,并创建适当的对象以特定方式读取数据(例如:读取为String).然后,将CSV文件中的数据保存在内存中供以后使用,就像读取普通TXT文件一样,即可读取CSV文件中的数据.
然后,我们创建2个方法.首先是getRowCount,它为我们提供了行/数据集的总数.
第二个是getRow,它从列表中收集特定的行,并将其保存到String []数组以供以后使用.
String []数组的显示类似于1个Excel行:
data index 0 | data index 1 | data index 2 | data index 3
我们有一个可以让我们轻松读取文件的类.让我们创建DataProvider
为了向测试提供数据,我们需要使用@Parameters批注并返回Collection< Object []>.进行测试.我稍后再说.
因此,让我们在DataProvider中实现它
public class CSVDataProvider {
public Collection<Object[]> getData() throws FileNotFoundException {
CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
int rowCount = reader.getRowCount();
Object[][] data = new Object[rowCount][2];
for (int i = 0; i < rowCount; i++) {
Object[] singleRow = reader.getRow(i);
data[i][0] = singleRow[0];
data[i][1] = singleRow[1];
}
return Arrays.asList(data);
}
}
我假设您在CSV文件中只有登录名和密码.这就是为什么我创建了一个二维数组new Object [rowCount] [2].我们通过提供必须存储的元素数量来创建数组,并从rowCount变量知道我们有多少行.
2表示每行只有2个数据.登录名和密码.例如,如果要使用其他元素-用户角色,则可以修改为[3]
在for循环中,我们将数据从CSV文件转换为数组,并将其返回以供以后使用.
现在,让我们谈谈我们的测试课.
@RunWith(Parameterized.class)
public class OurTest {
private String login,password;
public OurTest(String login,String password) {
this.login = login;
this.password = password;
}
@Parameterized.Parameters(name = "{index}: Login: ({0}) Password: ({1})")
public static Collection<Object[]> data() throws FileNotFoundException {
return new CSVDataProvider().getData();
}
@Test
public void test() {
System.out.println(String.format("login : %s | Password: %s",login,password));
}
}
为了将参数从DataProvider传递到我们的测试,我们需要
1.用@RunWith(Parameterized.class)注释类
2.创建一个返回Collection< Object []>的方法.带有注解@参数`
3.创建一个反映我们接受哪种数据的构造函数.
关于第3点,这就是为什么我用String登录名和String密码创建了一个2自变量构造函数的原因.我们正在传递这两个参数. JUnit将创建OurTest的新实例,并为每个测试传递不同的行.
在测试方法中,我只是打印了从DataProvider获得的数据
我没有提出一个完整的解决方案,因为我希望您尝试调整测试以了解这种特定方法.也称为数据驱动测试.
我们只有一种测试方法,但是CSV文件中的每一行都将作为单独的测试运行.
希望能帮助到你!