当前位置: 首页 > 知识库问答 >
问题:

如何仅在@Afterttest完成后运行测试

姬俊驰
2023-03-14

我正在和TestNG一起学习Java中的Selenium Webdriver。我正在使用谷歌登录页面进行测试。

我在按顺序运行测试用例时遇到了麻烦。我想做的是:

  1. 运行@BeforeTest
  2. 运行测试 1(登录成功)
  3. 运行@AfterTest(关闭浏览器和驱动程序)
  4. 等到 AfterTest 方法完成,然后运行测试 2(登录失败)

但我的经历是:

  1. 运行@BeforeTest
  2. 运行测试 1(登录成功)
  3. 测试
  4. 编号 1 完成后立即运行测试 2(浏览器未关闭,登录状态与之前的测试保持
  5. 运行后测试

我花了2天,但不知道怎么做。我的代码如下:

=================================================================

package TestNG;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;

public class GoogleAccountLogin {

    WebDriver driver;

    @BeforeTest
    public void setUp() {
        System.setProperty("webdriver.gecko.driver","F:\\path\\geckodriver.exe");
        driver=new FirefoxDriver();
    }

    @Test(priority=0)
    public void LoginSuccessful() throws InterruptedException { 

    // Go to google account
        driver.manage().window().maximize();
        driver.get("https://accounts.google.com");
        Thread.sleep(3000);

    // Check if the page is correct
        String currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "Sign in - Google Accounts");

    // Enter email and submit

        WebElement email = driver.findElement(By.id("Email"));
        email.clear();
        email.sendKeys("validemail");
        WebElement Next = driver.findElement(By.id("next"));
        Next.click();
        Thread.sleep(1000);

    // Enter password

        WebElement password = driver.findElement(By.id("Passwd"));
        password.clear();
        password.sendKeys("validpassword");
        WebElement Login = driver.findElement(By.id("signIn"));
        Login.click();  
        Thread.sleep(5000);

    // Check if login successful
        currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "My Account");
    }

    @Test(priority=1)
    public void LoginFailInvalidEmail() throws InterruptedException {

    // Go to google account
        driver.manage().window().maximize();
        driver.get("https://accounts.google.com");
        Thread.sleep(3000);

    // Check if the page is correct
        String currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "Sign in - Google Accounts");

    // Enter email and submit    
        WebElement email = driver.findElement(By.id("Email"));
        email.clear();
        email.sendKeys("falseemail");
        WebElement Next = driver.findElement(By.id("next"));
        Next.click(); 
        Thread.sleep(1000);

    // Check error message and login state    
        String errorMess = driver.findElement(By.id("errormsg_0_Email")).getText();
        Assert.assertEquals(errorMess, "Sorry, Google doesn't recognize that email.");
        currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "Sign in - Google Accounts");
    }

    @AfterTest
    public void tearDown() { 
        driver.close();
        driver.quit();
    }

}

共有1个答案

吴山
2023-03-14

从TestNG文档中:

@BeforeTest:在运行属于标记内类的任何测试方法之前,将运行带注释的方法。

@AfterTest:带注释的方法将在属于标记内的类的所有测试方法都运行后运行。

如果你想在每个测试方法之前和/或之后运行一些东西,你需要使用@BeforeMethod@AfterMethod

@BeforeMethod:注释方法将在每个测试方法之前运行。

@After方法:注释的方法将在每个测试方法之后运行。

 类似资料:
  • 问题内容: 我正在一个有几个无法更改的脚本的项目中。这些脚本通过AJAX更新页面。更新完成后,我需要运行一些代码。 XMLHttpRequest完成时是否会触发任何事件?(或任何XMLHttpRequest状态更改?)。 不幸的是,我无法访问用于发出请求的特定XMLHttpRequest对象。 谢谢, 问题答案: 如果没有jQuery,则可以挂钩该方法以在XHR对象被编辑时为每个XHR对象的事件附

  • 问题内容: 总的来说,我对Swift和Xcode还是比较陌生,并且发现很多困难要设法解决。 我正在开发一个利用后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,它都会异步地在其他线程上完成。但是,其余代码将继续在主线程上执行,并且当应该从服务器下载的数据尚未下载时,它将崩溃。我想知道如何在异步函数完成后调用函数来运行,这对于单独文件中的函数必须完成。 我读过闭包可能对此有

  • 在我的AngularJS应用程序中执行任何控制器之前,我有一些全局数据需要加载(即在AngularJS中全局解析依赖项)。 例如,我有一个,它带有方法,它向后端服务器发出请求,以获取关于当前通过身份验证的用户的数据。我有一个控制器需要这些数据来启动另一个请求(例如加载用户的余额)。 我怎样才能做到呢?

  • 问题内容: 我有一个看似简单的问题,没有明显的解决方案 (通过阅读Angular JS文档) 。 我有一个Angular JS指令,该指令根据其他DOM元素的高度进行一些计算,以定义DOM中容器的高度。 指令内部发生了类似的事情: 问题是当指令运行时,找不到它,返回一个空数组而不是我需要的jQuery包装的DOM元素。 我是否可以在指令中使用仅在加载DOM之后运行的回调,并且可以通过常规jQuer

  • 问题内容: 在AngularJS应用程序中执行任何控制器之前,我需要加载一些全局数据(即,在AngularJS中全局解析依赖项)。 例如,我有一个with 方法,该方法向后端服务器发出请求,以获取有关当前经过身份验证的用户的数据。我有一个控制器,需要该数据才能启动另一个请求(例如,加载用户的余额)。 我该如何实现? 问题答案: 如果可能,请考虑使用《使用服务器端数据异步引导AngularJS应用程

  • 大家好我有这样一个问题,我有2个异步功能。我只想在第一次完全结束后,运行第二次。这就是我试图做的: null null 但它并不总是起作用的,有时第二个函数的代码运行在第一个函数的代码之前,我不确定为什么,我用await强制第二个只在第一个结束之后。 我现在只想让第一个函数结束来激活第二个函数。