用于UI自动测试的selenide上的简单便捷的测试框架模板

你好。

在本文中,我想分享我在自动化功能测试中的经验。这将是关于编写一个方便,可靠的测试框架。

我们将使用的是:Java,Selenide,Alure,TestNG,Maven。



介绍


GitHub项目-SelenideBoilerplate

通常在有关测试自动化的文章中,示例远非现实,例如:

driver.get (“URL”)
driver.find_element_by_id(“ID”).send_keys(“username”)
driver.find_element_by_id (“ID”).send_keys(“password”)
driver.find_element_by_id(“submit”).click()

期望,页面对象等有很多类似的例子。结果,新手测试人员可能很难正确,方便地组织所有内容。该项目充满了拐杖,这就是为什么编写新测试和维护旧测试变得越来越困难的原因。

我认为有些工具过于冗长和过于复杂。

我将展示一个简单,方便且易于扩展的测试框架,该框架比常规硒更易于使用,并且已经在多个项目中成功使用。该项目是基础,在实际项目中,一切都比较复杂(并行化,remoteDriver,许多测试等)。

工具类


  • Selenide是一个用于编写简洁且稳定的开源UI测试的库。Selenide解决了超时,单击无法加载的项目等大多数问题。您也可以忘记StaleElementReferenceException一个非常方便易学的工具,您已经不再需要使用它与硒合作。
  • WebDriverManager-包含在Selenide中。一个库,负责完成为浏览器下载驱动程序并设置驱动程序路径的所有工作-
     System.setProperty("webdriver.browser.driver", "/path_to_driver/driver"); 
  • 吸引报道。
  • TestNG是一个测试框架。
  • Maven是用于自动化项目组装的工具。

项目结构




让我们从apppages模块开始

PageBuilder类


通常,示例给出的页面非常简单,所有内容都适合于一个类。但是在实际的项目中,可能会有相当大的页面,在一个类中描述所有功能并不是最好的主意。例如,这可以是具有多种形式的不同支付系统的充值页面。

在这种情况下,最好将页面分为几个类,甚至是元素(例如,篮子中的产品),然后将其全部放到页面的主类中。

因此,最好在一个位置(即PageBuilder类)中创建所有页面

package app;

import app.pages.LoginPage;

public class PageBuilder {

    public static LoginPage buildLoginPage() {
        return new LoginPage("/login");
    }

    public static BalancePage buildBalancePage() {
        DepositForm depositForm = new DepositForm();
        WithdrawalForm withdrawalForm = new WithdrawalForm();
        return new BalancePage("/balance", depositForm, withdrawalForm);
    }
}


类AppConfig


AppConfig存储被测Web应用程序的设置。例如-网站地址,测试用户等。在此项目中,这只是站点的地址。

package app;

public class AppConfig {

    public static final String baseUrl = "https://google.com";

}

应用类别


这是该模块中的主要类。App类的构造函数中,创建所有页面。

package app;

import app.pages.LoginPage;

public class App {

    public LoginPage loginPage;

    public App() {
        loginPage = PageBuilder.buildLoginPage();
    }
}

由于采用了这种方法,因此不必在测试中不断创建页面对象,只需要创建App对象即可从中获取必要的页面。

同样在App类中,可能有诸如注册,注册和创建订单等方法。

即,涉及多个页面对象并且在测试中经常需要的大型操作。

让我们继续到页面对象


感谢Selenide,使用页面对象很容易。所有页面都继承自BasePage基类相对页面URL传递给页面对象构造函数。

所有页面元素都有一个public access 修饰符,因此您可以用命令式和声明式两种方式编写测试。同样,您可以从元素中获取必要的数据,例如文本或某些属性。

定位器仅存储在一个地方。所有页面逻辑都应在页面方法中描述。

使用这种方法,如果发生故障或更改,在大多数情况下,无需重写测试,只需完成该方法的确定或将定位器更改为实际的测试。


package app.pages;

import com.codeborne.selenide.SelenideElement;
import helpers.Driver;
import static com.codeborne.selenide.Selenide.*;

public class LoginPage extends BasePage {

    public SelenideElement loginField = $("#login__username");
    public SelenideElement passwordField = $("#login__password");
    public SelenideElement signInButton = $("#login_enter");
    public SelenideElement termsOfUseLabel = $("label[for=\"login_agree\"]");

    public LoginPage(String pageUrl) {
        super(pageUrl);
    }
    
    public void login(String email, String password) {
        loginField.setValue(email);
        passwordField.setValue(password);
        termsOfUseLabel.click();
        signInButton.click();
        Driver.waitForUrlContains("account/accounts");
    }
}


休息


帮助器 模块包含2个重要的类:

TestConfig-从该类中,您可以获取运行测试的设置。默认设置也显示在这里。

测试是通过命令运行 mvn test -Dbrowser=chrome -Dheadless=1

的,变量的值是从命令行获取的,这要归功于TestConfig可以在测试和应用程序中使用。

例如,您可以根据环境(开发,阶段,生产)更改应用程序URL。


package helpers;

public class TestConfig {

    public static String browser = "chrome";
    public static String headless = "1";

    public static void initConfig() {
        browser = System.getProperty("browser") == null ? "chrome" : System.getProperty("browser");
        headless = System.getProperty("headless") == null ? "1" : System.getProperty("headless");
    }

    public static boolean isHeadless() {
        return headless.contains("1");
    }
}

Driver是我用一些有用的方法包装硒和硒化物驱动程序的方法。

最重要的方法:

Driver.initDriver() -在此初始化驱动程序/浏览器。

   public static void initDriver() {

        // Get settings from command line

        TestConfig.initConfig();

        // Set settings for selenide browser

        Configuration.pageLoadStrategy = "eager";
        Configuration.browserSize = "1920x1080";
        Configuration.holdBrowserOpen = false;
        Configuration.screenshots = false;

        if(TestConfig.isHeadless()) {
            Configuration.headless = true;
        } else {
            Configuration.headless = false;
        }

        switch (TestConfig.browser) {
            case "chrome":
                Configuration.browser = Browsers.CHROME;
                break;
            case "firefox":
                Configuration.browser = Browsers.FIREFOX;
                break;
            default:
                Configuration.browser = Browsers.CHROME;
                break;
        }
    }

Driver.clearCookies()
Driver.close()

测验


所有测试类均继承自A_BaseTest,在该类中创建App应用程序对象loggersoftAssert,浏览器打开和关闭,每次测试后清除cookie。

还有一个A_BaseTestListener可以记录错误。

测试看起来像这样。易于阅读,易于维护。

import org.testng.annotations.Test;

public class ExampleTest extends A_BaseTest
{
    @Test
    public void loginViaEmail() {
        app.loginPage.open();
        app.loginPage.login("email@email.com", "passwords");
        
        logger.info("Sample info message");
               
        softAssert.assertEquals(2,2);
        softAssert.assertAll();
    }
}

测试类在testng.xml中指定

测试输出文件夹包含日志和屏幕截图-Driver.takeScreenshot()

对于报告,使用“ 魅力”测试完成后,您可以运行命令allure serve target/allure-results并查看报告。

GitHub项目-SelenideBoilerplate

All Articles