【问题标题】:How to run tests without closing webdriver using PO?如何在不使用 PO 关闭 webdriver 的情况下运行测试?
【发布时间】:2021-07-30 16:21:08
【问题描述】:

请帮助我完成我的 Selenium 项目。 GIT 存储库链接:https://kodov@bitbucket.org/kodov/addressbook5.git

我有一个要测试的应用程序地址簿 (https://sourceforge.net/projects/php-addressbook/)。 我对登录页面和创建新联系人的页面进行了几次测试。 案例制作:

  1. 登录的否定测试
  2. 登录的正面测试
  3. 然后我不需要关闭浏览器而是运行测试来创建联系人。 问题是我制作了 POM 并且我的测试和页面在不同的类中,所以我不知道如何退出 Webdriver 只是在所有测试之后,但不是在第一个测试之后。 也许我需要更改注释。

【问题讨论】:

  • 所以如果我理解正确有两个问题: 1. 你的浏览器在每次测试后都会关闭。 2. 完成所有测试后,您想关闭/退出浏览器。如果我错了,请纠正我?而案例 1,2 和 3 是一个单一的测试?
  • 其实每次测试课后它都会关闭。你是对的,我想在所有测试完成后退出浏览器。
  • 如果可能的话,你能把你的 git repo 公开吗?

标签: java selenium testng


【解决方案1】:

您可以创建一个 Base Test 类并让其他测试类扩展该类。

例如:

public class BaseTest {

public static WebDriver driver;
private static boolean isTestsStarted;
public static WebDriverWait wait;

    @BeforeClass
    public static void setup() {
        // To run setup method before all tests that extends this base class
        if(!isTestsStarted) {
        System.setProperty("webdriver.chrome.driver", ConfProperties.getProperty("chromedriver_path"));
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        driver.get(ConfProperties.getProperty("base_url"));
        isTestsStarted = true;
}
    }

    // To quit driver after all tests run
    // This will run only once, after all tests ran
    // Another advantage of this is, it will quit driver even though you stop the program manually
    static {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            driver.quit();
        }));
    }

}

然后在你的测试类中扩展这个基类 为您的 loginTest 课程

public class LoginTest extends BaseTest {

    public static LoginPage loginPage;
    public static MainPage mainPage;

    @BeforeClass
    public static void setup() {
        // You can call driver object since you initialized it in your parent class
        loginPage = new LoginPage(driver);
        mainPage = new MainPage(driver);
        driver.get(ConfProperties.getProperty("base_url"));
    }

    @Test
    public void testUserCanNotLoginWithInvalidCredentials() {
        loginPage.clearUsernameField().clearPasswordField()
                 .enterUsername(ConfProperties.getProperty("invalid_username"))
                 .enterPassword(ConfProperties.getProperty("invalid_password"))
                 .clickLoginButton();
        assertThat(loginPage.getLoginButton().isDisplayed()).isTrue();
    }

    @Test
    public void testUserCanLoginWithValidCredentials() {
        loginPage.clearUsernameField().clearPasswordField()
                 .enterUsername(ConfProperties.getProperty("valid_username"))
                 .enterPassword(ConfProperties.getProperty("valid_password"))
                 .clickLoginButton();
        assertThat(mainPage.getUserName())
                 .isEqualTo(ConfProperties.getProperty("valid_username"));
    }
}

同样的,你可以在其他类中使用你的驱动对象,如果你让这些类扩展 BaseTest 类

【讨论】:

  • 嗨。感谢您的回复。我在项目中进行了更改,但无法使其使用相同的驱动程序和会话。问题是我希望我的第一个测试类打开浏览器,然后第二个测试类打开该浏览器并使用它。我用我的修订创建了新的分支。 bitbucket.org/kodov/addressbook5/src/master
  • 它不起作用,因为在您的第一个类 (CreateNewAddressTest) 中,您使用带有 @AfterClass 注释的 driver.quit() 方法。并在 LoginTest 类中初始化新驱动程序。当您尝试我建议的方法时发生了什么?
  • 是的。有效!对不起我的疏忽。感谢您的帮助!
【解决方案2】:

无论如何,您都需要登录,因此您必须在两个测试中都包含登录部分。

您也可以尝试@Test(dependsOnMethods = { "testName" }),但我不确定当您的测试在另一个文件中时这是否有效。

【讨论】:

  • 我想登录一次,然后在这个会话中继续测试。并在所有测试后注销。
  • 您可以在@beforeClass 方法中添加登录部分。
  • 如果我这样做,那么如何进行积极的登录测试?因为如果我登录 beforeClass,有两种方式 - 如果我可以登录,它们不在 @Test 中,而是在 beforeClass 中。
  • 有一个测试将登录 n 做剩下的事情。
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多