Design patterns Selenium警报处理测试方法/设计模式
我是Selenium的新手,我正在尝试典型的登录页面自动化,遇到以下场景,我想知道处理这种情况的专业方法 情景 使用有效和无效凭据测试应用程序登录页。当我输入无效凭据时,会弹出一个窗口,通知用户您输入了错误的用户名或密码 我的方法Design patterns Selenium警报处理测试方法/设计模式,design-patterns,selenium-webdriver,testng,pageobjects,Design Patterns,Selenium Webdriver,Testng,Pageobjects,我是Selenium的新手,我正在尝试典型的登录页面自动化,遇到以下场景,我想知道处理这种情况的专业方法 情景 使用有效和无效凭据测试应用程序登录页。当我输入无效凭据时,会弹出一个窗口,通知用户您输入了错误的用户名或密码 我的方法 我创建了一个page对象类,使用page Factory保存所有Web元素,并使用一些公共方法将Web元素公开给类外 在测试类中,我创建了被测试页面的对象,并使用testng xml传递了登录凭据 然后我穿上了Testng套装,它跑得很好。但问题是,当我传递无效凭证时
public void loginToGuru99(String userName,String password){
this.setUsername(userName);
this.setPassword(password);
this.clickOnLogin();
}
@BeforeTest
public void setup() {
driver= new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://demo.guru99.com/V4/");
}
// @Test(dataProvider="Authentication")
@Test
@Parameters({ "sUsername", "sPassword" })
public void TestGuru99LoginPage(String sUsername,String sPassword) {
login= new Guru99LoginPage(driver);
homePage= new Guru99HomePage(driver);
try{
login.loginToGuru99(sUsername, sPassword);
Assert.assertTrue(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}catch(Exception e){
e.printStackTrace();
}
}
public static boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
public static String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
TestGuru99LoginPage.java
public void loginToGuru99(String userName,String password){
this.setUsername(userName);
this.setPassword(password);
this.clickOnLogin();
}
@BeforeTest
public void setup() {
driver= new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://demo.guru99.com/V4/");
}
// @Test(dataProvider="Authentication")
@Test
@Parameters({ "sUsername", "sPassword" })
public void TestGuru99LoginPage(String sUsername,String sPassword) {
login= new Guru99LoginPage(driver);
homePage= new Guru99HomePage(driver);
try{
login.loginToGuru99(sUsername, sPassword);
Assert.assertTrue(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}catch(Exception e){
e.printStackTrace();
}
}
public static boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
public static String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
Utils.java
public void loginToGuru99(String userName,String password){
this.setUsername(userName);
this.setPassword(password);
this.clickOnLogin();
}
@BeforeTest
public void setup() {
driver= new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://demo.guru99.com/V4/");
}
// @Test(dataProvider="Authentication")
@Test
@Parameters({ "sUsername", "sPassword" })
public void TestGuru99LoginPage(String sUsername,String sPassword) {
login= new Guru99LoginPage(driver);
homePage= new Guru99HomePage(driver);
try{
login.loginToGuru99(sUsername, sPassword);
Assert.assertTrue(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}catch(Exception e){
e.printStackTrace();
}
}
public static boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
public static String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
请让我知道开始的最佳方法
谢谢,
Deepu Nair当您期望两个测试用例的结果不同时,您必须使用不同的断言,但是您可以从PageObject中使用相同的方法。如您所见,第一个将在您登录时通过,第二个将仅在您未登录时通过
@Test
public void validLogin() {
// ...
String username = "validUsername";
String password = "validPassword";
login.clickOnLoginButton(username, password);
Assert.assertTrue(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}
@Test
public void invalidLogin() {
String username = "invalidUsername";
String password = "invalidPassword";
login.clickOnLoginButton(username, password);
Assert.assertFalse(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}
由于您期望两个测试用例都有不同的结果,所以您必须使用不同的断言,但是您可以从PageObject中使用相同的方法。如您所见,第一个将在您登录时通过,第二个将仅在您未登录时通过
@Test
public void validLogin() {
// ...
String username = "validUsername";
String password = "validPassword";
login.clickOnLoginButton(username, password);
Assert.assertTrue(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}
@Test
public void invalidLogin() {
String username = "invalidUsername";
String password = "invalidPassword";
login.clickOnLoginButton(username, password);
Assert.assertFalse(homePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mngr13564"));
}
在您的测试中,您正在检查有效的登录方法,因此只有在您使用有效凭据时,您的测试才会通过,而如果您使用的凭据不正确,测试将失败。这不是你所期望的吗?我同意@peetya。您正在尝试测试两件事:有效凭据登录成功,无效凭据登录失败,因此您需要有两种不同的测试方法,如果不是不同的测试类的话。无论您是否通过有效凭据(成功登录或无效凭据(处理弹出窗口),成功测试的值是多少。谢谢您的回复。@peetya根据我的说法,这两个测试用例都应该通过,因为在这两种情况下,我都得到了预期的结果。@user2611581:所以您建议的最佳方法是多用一种方法来处理无效凭据,对吗?我也在考虑避免重复代码。非常感谢。因为我是selenium的新手,所以我需要正在考虑是否有其他方法来实现此目的。@DeepuNair:如果TestGuru99LoginPage.java是您的测试,那么我还建议您考虑将登录和主页的实例化移到@BeforeTest方法,并仅调用
code
login.logintogru99(sUsername,sPassword)code
以及Assert.assertTrue或Assert.assertFalse方法..类似于peetya在下面的答案中所做的。在测试中,您正在检查有效的登录方法,因此只有在使用有效凭据时,您的测试才会通过,如果您使用的凭据不好,测试就会失败。这不是您所期望的吗?我同意@peetya。您正在尝试测试两件事:有效凭据登录成功和无效凭据登录失败,因此如果没有不同的测试类,则需要有两种不同的测试方法。无论您通过有效凭据(成功登录或无效凭据)(处理弹出窗口),成功的测试值是多少。谢谢您的回复。@peetya根据我的说法,这两个测试用例都应该通过,因为在这两种情况下,我都得到了预期的结果。@user2611581:所以您建议的最佳方法是多用一种方法来处理无效凭据,对吗?我也在考虑避免重复代码。非常感谢。因为我是selenium的新手,所以我需要正在考虑是否有其他方法来实现此目的。@DeepuNair:如果TestGuru99LoginPage.java是您的测试,那么我还建议您考虑将登录和主页的实例化移到@BeforeTest方法,并仅调用code
login.logintogru99(sUsername,sPassword)code
以及Assert.assertTrue或Assert.assertFalse方法..类似于peetya在下面的答案中所做的。在测试中,您正在检查有效的登录方法,因此只有在使用有效凭据时,您的测试才会通过,如果您使用的凭据不好,测试就会失败。这不是您所期望的吗?我同意@peetya。您正在尝试测试两件事:有效凭据登录成功和无效凭据登录失败,因此如果没有不同的测试类,则需要有两种不同的测试方法。无论您通过有效凭据(成功登录或无效凭据)(处理弹出窗口),成功的测试值是多少。谢谢您的回复。@peetya根据我的说法,这两个测试用例都应该通过,因为在这两种情况下,我都得到了预期的结果。@user2611581:所以您建议的最佳方法是多用一种方法来处理无效凭据,对吗?我也在考虑避免重复代码。非常感谢。因为我是selenium的新手,所以我需要正在考虑是否有其他方法来实现此目的。@DeepuNair:如果TestGuru99LoginPage.java是您的测试,那么我还建议您考虑将登录和主页的实例化移到@BeforeTest方法,并仅调用code
login.logintogru99(sUsername,sPassword)code
以及Assert.assertTrue或Assert.assertFal