在将应用程序作为TestNG测试运行时破坏了测试用例

时间:2019-05-10 02:08:23

标签: selenium-webdriver testng selenium-chromedriver

我编写了一个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应用程序运行时,不会发生这种情况

3 个答案:

答案 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框架将按字母顺序运行测试方法。我可以看到您的测试方法是相关的,并且应该按顺序排列。您可以按照您希望的运行方式来设置测试方法的优先级。

您可以参考下面的链接来设置优先级。

TestNG priority set