Java 如何使用不同的csv行循环此测试?
我是硒测试的初学者。我写了这段代码,它可以工作,但我需要用另一个csv行循环这个测试 我花了将近10个小时来做这件事 我正在尝试做的场景:Java 如何使用不同的csv行循环此测试?,java,selenium,testng,Java,Selenium,Testng,我是硒测试的初学者。我写了这段代码,它可以工作,但我需要用另一个csv行循环这个测试 我花了将近10个小时来做这件事 我正在尝试做的场景: web浏览器正在打开“转到url” 从第一行使用CSV文件中的数据登录 驱动程序正在重新启动,并使用csv文件第二行中的数据执行相同操作 我还尝试用aftermethod/afterclass重新启动测试,但它不起作用 public class CSVdataread { private WebDriver driver; String ba
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();
}
}
}
}
公共类CSVdataread{
私有网络驱动程序;
字符串baseUrl=“URL”;
字符串CSV\u file=“C:\\Users\\xxxxxxxxxx\\Desktop\\TestData.CSV”;
@课前
public void openBrowser(){
System.setProperty(“webdriver.chrome.driver”,“C:\\Users\\xxxxxxxxxxx\\Desktop\\webdriver\\chromedriver.exe”);
驱动程序=新的ChromeDriver();
driver.navigate()指向(“URL”);
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}
@试验
public void verify_Search()引发InterruptedException,IOException{
CSVReader reader=新CSVReader(新文件读取器(CSV_文件));
字符串[]单元格;
while((cell=reader.readNext())!=null)
对于(int i=0;i<1;i++){
字符串名称=单元格[i];
字符串email=cell[i+1];
字符串baseUrl=”http://xxxxx.xxx/xxxx/";
findelelement(By.xpath(“//input[@id='useridFormField-inputEl']”);
findElement(By.xpath(“//input[@id='userpasswordFormField-inputEl']”);
{
driver.quit();
}
}
}
}
您的while循环看起来已断开。while循环中的for循环似乎打乱了登录过程
while((cell = reader.readNext())!=null) { // iterate through csv file
String name = cell[0]; // cell is current row, you need first column for name
String email = cell[1]; // second column for email (as password?)
// what do you want to do with baseUrl here?
driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
// you need to check the successful login here
// then logout and open main page
// do not quit before you are finished
}
// quit after the loop is finished
driver.quit();
没有任何网站的知识,它是不可能告诉你如何检查成功登录和执行注销
我可以建议你花点精力学习一项不太复杂的任务的诀窍吗?您似乎在使用基本Java元素时遇到了很多问题。永远不要停止学习。看起来您想用一组测试数据重复测试。在这种情况下,您应该使用TestNG特性
JUnit4解决方案。这将是一个巨大的 首先,让我们从
CSVReader
和一些良好实践以及代码可读性开始。在测试中,您读取CSV数据并在测试中使用它们。读取数据不是测试的责任。测试应该已经提供了所有数据。它被称为DataProvider
。这个术语实际上在TestNG
测试框架中使用,就像@user861594建议的那样
所以,您应该有一些东西为您的测试提供数据。但这已经是第二步了。因为您知道将从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();
}
}
我们有一个类,可以让我们轻松地阅读文件。让我们创建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);
}
}
为了向测试提供数据,我们需要使用@Parameters
注释并将集合
返回到我们的测试。我稍后再谈这个问题
因此,让我们在我们的数据提供者中实现它
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);
}
}
为了将参数从DataProvider
传递到我们的测试,我们需要
1.用@RunWith(Parameterized.class)
2.创建一个返回带有注释的集合的方法`
3.创建一个反映我们接受哪种数据的构造函数
关于第3点,这就是为什么我创建了一个带有stringlogin
和stringpassword
的2参数构造函数。我们正在传递这两个参数。JUnit将创建一个新的OurTest
实例,并为每个测试通过不同的行
在测试
方法中,我刚刚打印了我们从数据提供者
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文件中的每一行都将作为单独的测试运行
希望有帮助
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);
}
}
@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));
}
}