如何用不同的 csv 行循环这个测试?
How to loop this test with different csv row?
我是硒测试的初学者。我写了这段代码并且它有效,但我需要用另一个 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();
}
}
}
}
您的 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 data provider 功能。
public class CSVdataread {
private WebDriver driver;
String baseUrl = "URL";
String CSV_file = "C:\Users\xxxxxxxxxxx\Desktop\TestData.csv";
@BeforeMethod
public void openBrowser() {
System.setProperty("webdriver.chrome.driver", "C:\Users\xxxxxxxxxxxx\Desktop\webdriver\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test(dataProvider="users-data")
public void verify_Search(String name, String email) throws InterruptedException, IOException {
String baseUrl = "http://xxxxx.xxx/xxxx/";
driver.navigate().to(baseUrl);
driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
}
//This method will provide data to any test method that declares that its Data Provider
@DataProvider(name = "users-data")
public Iterator<Object[]> createDataFromCSV() {
CSVReader reader = new CSVReader(new FileReader(CSV_file));
List<Object[]> data = new ArrayList<Object[]>();
//read csv data to list
return data.iterator();
}
@AfterMethod
public void closeBrowser() {
driver.quit();
}
}
您还可以利用可用的 data-provider-extension。例如,使用 qaf 您不需要为驱动程序管理或数据提供程序编写代码。您的测试 class 将如下所示:
public class CSVdataread extends WebDriverTestCase{
@QAFDataProvider(dataFile="resources/user-data.csv")
@Test()
public void verify_Search(String name, String email) throws InterruptedException, IOException {
String baseUrl = "http://xxxxx.xxx/xxxx/";
getDriver().navigate().to(baseUrl);
getDriver().findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
//another way of finding element...
getDriver().findElement("xpath=//input[@id='userpasswordFormField-inputEl']").sendKeys(email);
}
}
JUnit 4 解决方案。这个会很大...
首先,让我们从 CSVReader
和一些良好实践以及代码可读性开始。在您的测试中,您读取 CSV 数据并在测试中使用它们。读取数据不是测试的责任。测试应该已经拥有提供给它的所有数据。它被称为DataProvider
。这个术语实际上在 TestNG
测试框架中使用,就像@user861594 建议的那样。
所以,您应该有一些东西可以为您的测试提供数据。但这已经是第 2 步了。由于您知道您将从 CSV 文件中逐行读取数据,因此您应该创建一个适当的 class 来从 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 文件中一样,通过将行保存在内存中供以后使用。
然后我们创建2个方法。首先是 getRowCount
,它给出了 row/set 数据的总数。
第二个是 getRow
,它从列表中收集特定的行并将其保存到 String[]
数组以备后用。
String[]
数组的表示形式类似于 1 Excel 行:
data index 0 | data index 1 | data index 2 | data index 3
我们有一个 class 可以让我们轻松读取文件。让我们创建 DataProvider
为了向测试提供数据,我们需要对我们的测试使用@Parameters
注释和returnCollection<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 文件转换为数组,return 以备后用。
现在,让我们谈谈我们的测试class。
@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)
注释class
2. 创建方法 returning Collection<Object[]> with annotation
@Parameters`
3. 创建一个反映我们接受什么样的数据的构造函数。
关于第 3 点,这就是我使用 String login
和 String password
创建一个 2 参数构造函数的原因。我们正在传递这两个参数。 JUnit 将创建一个新的 OurTest
实例并为每个测试传递不同的行。
在 test
方法中,我刚刚打印了我们从 DataProvider
中获得的数据
我没有提供完全有效的解决方案,因为我希望您尝试调整您的测试以学习这种特定方法。它也被称为Data-driven Testing
。
我们只有一种测试方法,但 CSV 文件中的每一行都将 运行 作为单独的测试。
希望对您有所帮助!
我是硒测试的初学者。我写了这段代码并且它有效,但我需要用另一个 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();
}
}
}
}
您的 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 data provider 功能。
public class CSVdataread {
private WebDriver driver;
String baseUrl = "URL";
String CSV_file = "C:\Users\xxxxxxxxxxx\Desktop\TestData.csv";
@BeforeMethod
public void openBrowser() {
System.setProperty("webdriver.chrome.driver", "C:\Users\xxxxxxxxxxxx\Desktop\webdriver\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test(dataProvider="users-data")
public void verify_Search(String name, String email) throws InterruptedException, IOException {
String baseUrl = "http://xxxxx.xxx/xxxx/";
driver.navigate().to(baseUrl);
driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
}
//This method will provide data to any test method that declares that its Data Provider
@DataProvider(name = "users-data")
public Iterator<Object[]> createDataFromCSV() {
CSVReader reader = new CSVReader(new FileReader(CSV_file));
List<Object[]> data = new ArrayList<Object[]>();
//read csv data to list
return data.iterator();
}
@AfterMethod
public void closeBrowser() {
driver.quit();
}
}
您还可以利用可用的 data-provider-extension。例如,使用 qaf 您不需要为驱动程序管理或数据提供程序编写代码。您的测试 class 将如下所示:
public class CSVdataread extends WebDriverTestCase{
@QAFDataProvider(dataFile="resources/user-data.csv")
@Test()
public void verify_Search(String name, String email) throws InterruptedException, IOException {
String baseUrl = "http://xxxxx.xxx/xxxx/";
getDriver().navigate().to(baseUrl);
getDriver().findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
//another way of finding element...
getDriver().findElement("xpath=//input[@id='userpasswordFormField-inputEl']").sendKeys(email);
}
}
JUnit 4 解决方案。这个会很大...
首先,让我们从 CSVReader
和一些良好实践以及代码可读性开始。在您的测试中,您读取 CSV 数据并在测试中使用它们。读取数据不是测试的责任。测试应该已经拥有提供给它的所有数据。它被称为DataProvider
。这个术语实际上在 TestNG
测试框架中使用,就像@user861594 建议的那样。
所以,您应该有一些东西可以为您的测试提供数据。但这已经是第 2 步了。由于您知道您将从 CSV 文件中逐行读取数据,因此您应该创建一个适当的 class 来从 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 文件中一样,通过将行保存在内存中供以后使用。
然后我们创建2个方法。首先是 getRowCount
,它给出了 row/set 数据的总数。
第二个是 getRow
,它从列表中收集特定的行并将其保存到 String[]
数组以备后用。
String[]
数组的表示形式类似于 1 Excel 行:
data index 0 | data index 1 | data index 2 | data index 3
我们有一个 class 可以让我们轻松读取文件。让我们创建 DataProvider
为了向测试提供数据,我们需要对我们的测试使用@Parameters
注释和returnCollection<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 文件转换为数组,return 以备后用。
现在,让我们谈谈我们的测试class。
@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)
注释class
2. 创建方法 returning Collection<Object[]> with annotation
@Parameters`
3. 创建一个反映我们接受什么样的数据的构造函数。
关于第 3 点,这就是我使用 String login
和 String password
创建一个 2 参数构造函数的原因。我们正在传递这两个参数。 JUnit 将创建一个新的 OurTest
实例并为每个测试传递不同的行。
在 test
方法中,我刚刚打印了我们从 DataProvider
我没有提供完全有效的解决方案,因为我希望您尝试调整您的测试以学习这种特定方法。它也被称为Data-driven Testing
。
我们只有一种测试方法,但 CSV 文件中的每一行都将 运行 作为单独的测试。
希望对您有所帮助!