Escribí una aplicación Java para usar el selenio webdriver para automatizar algunas tareas de aplicaciones web. Todos funcionaron bien cuando se ejecutan como una aplicación Java.

Para usar la función de informes TestNG, ejecuté la aplicación como una prueba TestNG en lugar de la aplicación JAVA. La misma prueba que funcionaba como aplicación JAVA falla cuando ejecuto como testNG.

Sin embargo, supongo que configuré TestNG correctamente ya que está pasando el primer caso de prueba que se utiliza para iniciar sesión en la aplicación web (método webLogin en el código a continuación)

Estoy usando chromeDriver. Intenté eliminar el método principal para ejecutarlo como aplicación testNG. Pero no funcionó. Me aseguré de que los localizadores de ruta de elementos que estoy usando sigan siendo válidos mientras uso 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();
    }
}

Al ejecutar el código anterior, obtiene el siguiente error:

Default suite
Total tests run: 5, Failures: 4, Skips: 0

También veo que lleva mucho tiempo (unos 10 segundos) antes de que la página inicie sesión a pesar de que la prueba pasa. Esto no sucede cuando ejecuto el código como una aplicación Java

0
user3547407 10 may. 2019 a las 05:08

3 respuestas

La mejor respuesta

¿Puedes mostrar qué pruebas están fallando realmente? si está buscando el orden en la ejecución de la prueba de testng, no viene de forma predeterminada, por lo que si tiene que ejecutar test2 después de test1 y test3 después de test2, etc., debe usar prioridad (reducir el número más alta la prioridad) para ex,

@Test(priority=1)
public void Test1() {

}

@Test(priority=2)
public void Test2() {

}

@Test(priority=3)
public void Test3() {

}

Espero que esto ayude

No, testng nunca garantiza pedidos por defecto

TestNG se basa en la reflexión. Las API de Java Reflection no garantizan el orden del método cuando lo usamos para introspectar una clase para descubrir cuáles son los métodos de prueba que están disponibles en ella. Por lo tanto, el orden de la ejecución de los métodos independientes (métodos que no tienen dependencia suave o dura) nunca está garantizado.

Dependencia flexible: esto generalmente se logra en TestNG mediante el uso del atributo de prioridad para la anotación @Test. Se llama dependencia blanda porque TestNG continuará ejecutando todos los métodos a pesar de que un método anterior con una prioridad más alta falló.

Dependencia dura: esto generalmente se logra en TestNG mediante el uso del atributo depeOnMethods (o) depeOnGroups para la anotación @Test. Se llama dependencia dura porque TestNG continuará ejecutando un método descendente si y solo si un método ascendente se ejecutó correctamente.

1
Ramprasad 10 may. 2019 a las 06:24

Testng Framework ejecutará los métodos de prueba en orden alfabético. Pude ver que sus métodos de prueba son dependientes y deberían hacerlo en el orden. Puede establecer las prioridades para sus métodos de prueba de la forma en que desea que se ejecuten.

Puede consultar el siguiente enlace para establecer la prioridad.

TestNG conjunto de prioridades

1
Ranjith V 11 may. 2019 a las 12:22

Por defecto, testng ejecuta métodos en orden alfabético de los nombres de los métodos. Por lo general, no usaría el método principal para probar. Las anotaciones junto con la prioridad se usan para establecer la secuencia de ejecuciones

1
A-K 10 may. 2019 a las 05:43