我编写了一个Java应用程序,以使用Selenium Webdriver自动执行一些Web应用程序任务。当作为Java应用程序运行时,它们都工作正常。
要使用TestNG报告功能,我将应用程序作为TestNG测试而不是JAVA应用程序运行。当我以testNG运行时,与JAVA应用程序相同的测试失败。
但是,我猜想我已经正确设置了TestNG,因为用于登录Web应用程序的第一个测试用例已经通过(下面代码中的webLogin方法)
我正在使用chromeDriver。我尝试删除主要方法以将其作为testNG应用程序运行。但这没有用。我确保使用testNG时我正在使用的元素路径定位符仍然有效。
package myPackage;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.*;
import com.google.common.base.Function;
public class checkNavigation {
public static WebDriver driver;
public static WebDriverWait wait;
public static void main(String args[]) throws InterruptedException{
Configure();
wait = new WebDriverWait(driver, 30);
webLogin();
addClient();
addGoal();
addInsurance();
validateInputs();
endSession();
}
@BeforeTest
public static void Configure() {
System.setProperty("webdriver.chrome.driver", "/Users/divyakapa/Desktop/automation/chromedriver");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.get("https://example.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public static void webLogin() {
getElement(By.xpath("//*[@id=\"id\"]")).sendKeys("admin");
getElement(By.xpath("//*[@id=\"pw\"]")).sendKeys("password");
getElement(By.xpath("//*[@id=\"ember383\"]/div/div/form/button/span")).click();
}
@Test
public static void addClient() {
getElement(By.xpath("//*[@id=\"ember744\"]/button/div")).click();
getElement(By.xpath("//*[@id=\"ember744\"]/div/button[1]/div[2]/div")).click();
getElement(By.xpath("//*[@id=\"newInputFirst\"]")).sendKeys("firstName");
getElement(By.xpath("//*[@id=\"newInputLast\"]")).sendKeys("lastName");
getElement(By.xpath("//*[@id=\"newPersonInputBirthday\"]")).sendKeys("1991");
Select location = new Select(driver.findElement(By.xpath("//*[@id=\"newUserInputProvince\"]")));
location.selectByVisibleText("Place1");
Select isRetired = new Select(driver.findElement(By.xpath("//*[@id=\"alreadyRetiredDropdown\"]")));
isRetired.selectByVisibleText("No");
Select age = new Select(driver.findElement(By.xpath("//*[@id=\"newRetirementAge\"]")));
age.selectByVisibleText("60");
getElement(By.xpath("//*[@id=\"data-entry-modal\"]/div[2]/div/div[1]/div[2]/button[2]")).click();
}
@Test
public static void addGoal() {
getElement(By.xpath("//*[@id=\"ember2328\"]/button/div")).click();
getElement(By.xpath("//*[@id=\"ember2328\"]/div/div[1]/div[2]/button[3]")).click();
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"ember2464\"]/ul/li[1]/div/div/div[2]/div/span"))).click();
getElement(By.xpath("//*[@id=\"basicExpenseInputAmount\"]")).clear();
getElement(By.xpath("//*[@id=\"basicExpenseInputAmount\"]")).sendKeys("90000");
getElement(By.xpath("//*[@id=\"ember2563\"]/div/div[2]/div[2]/button[2]")).click();
// Add income
getElement(By.xpath("//*[@class=\"add-button \"]")).click();
getElement(By.xpath("//*[@data-test-model-type=\"income\"]")).click();
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class=\"list-group\"]/li[1]"))).click();
getElement(By.xpath("//*[@id=\"employmentInputName\"]")).clear();
getElement(By.xpath("//*[@id=\"employmentInputName\"]")).sendKeys("Company");
getElement(By.xpath("//*[@id=\"employmentInputSalary\"]")).sendKeys("95000");
getElement(By.xpath("//*[@id=\"employmentInputBonus\"]")).sendKeys("5000");
getElement(By.xpath("//*[@id=\"employmentInputBenefitsInKind\"]")).sendKeys("1000");
getElement(By.xpath("//*[@aria-label=\"Save\"]")).click();
}
@Test
public static void addInsurance() {
getElement(By.xpath("//*[@class=\"add-button \"]")).click();
getElement(By.xpath("//*[@data-test-model-type=\"protection\"]")).click();
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class=\"list-group\"]/li[1]"))).click();
getElement(By.xpath("//*[@id=\"termLifeName\"]")).clear();
getElement(By.xpath("//*[@id=\"termLifeName\"]")).sendKeys("BlueCrossBlueShield");
getElement(By.xpath("//*[@id=\"ukTermProtectionSalaryMultiplier\"]")).clear();
getElement(By.xpath("//*[@id=\"ukTermProtectionSalaryMultiplier\"]")).sendKeys("5");
Select empId = new Select(driver.findElement(By.xpath("//*[@id=\"termLifeInsuranceEmploymentId\"]")));
empId.selectByVisibleText("Company");
getElement(By.xpath("//*[@aria-label=\"Save\"]")).click();
}
@Test
public static void validateInputs() {
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
if(!(driver.findElements(By.xpath("//*[@data-test-accordion-header=\"goals\"]")).size() > 0)) throw new NullPointerException("Income Failed to ADD");
if(!(driver.findElements(By.xpath("//*[@data-test-accordion-header=\"income\"]")).size() > 0)) throw new NullPointerException("Income Failed to ADD");
if(!(driver.findElements(By.xpath("//*[@data-test-accordion-header=\"protection\"]")).size() > 0)) throw new NullPointerException("Income Failed to ADD");
}
public static WebElement getElement(final By locator) {
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver).ignoring(NoSuchElementException.class);
WebElement element = wait.until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver arg0) {
return arg0.findElement(locator);
}
});
return element;
}
@AfterTest
public static void endSession() {
driver.close();
driver.quit();
}
}
运行上面的代码,得到以下错误:
Default suite
Total tests run: 5, Failures: 4, Skips: 0
我还看到即使该测试通过了,页面登录仍需要花费大量时间(约10秒)。当我将代码作为Java应用程序运行时,不会发生这种情况
答案 0 :(得分:1)
您能显示出哪些测试实际上失败了吗?如果您要在执行testng的测试中寻找订单,则默认情况下该订单不是默认的,因此,如果您必须在test1之后运行test2,在test2之后运行test3等,则必须对ex使用优先级(数字越小优先级越高),
@Test(priority=1)
public void Test1() {
}
@Test(priority=2)
public void Test2() {
}
@Test(priority=3)
public void Test3() {
}
希望这会有所帮助
否,testng不能保证默认情况下订购
TestNG依赖于反射。当我们使用Java Reflection API对一个类进行内省以找出其中可用的测试方法时,它不保证方法的顺序。因此,永远不能保证独立方法(不具有软依赖性或硬依赖性)的执行顺序。
软件依赖项-通常在TestNG中通过使用@Test批注的优先级属性来实现。之所以称为软依赖关系,是因为即使具有更高优先级的先前方法失败了,TestNG也会继续执行所有方法。
硬依赖性-这通常在TestNG中通过对@Test批注使用dependsOnMethods(或)dependsOnGroups属性来实现。之所以称为硬依赖性,是因为只有当上游方法成功运行时,TestNG才会继续执行下游方法。
答案 1 :(得分:1)
默认情况下,testng按方法名称的字母顺序执行方法。通常,您不会使用主要方法进行测试。注释和优先级用于设置执行顺序
答案 2 :(得分:1)
Testng框架将按字母顺序运行测试方法。我可以看到您的测试方法是相关的,并且应该按顺序排列。您可以按照您希望的运行方式来设置测试方法的优先级。
您可以参考下面的链接来设置优先级。