如何构建硒UI测试框架
#java #测验 #自动化 #selenium

硒UI测试自动化框架

我最近为样品飞行/酒店预订网站创建了一个硒UI测试自动化框架。该框架基于页面图和流利的接口模式,并使用硒,测试和范围报告。

该框架设计为易于使用和维护。它包括一组代表网站不同页面的页面类,以及一组练习页面类的测试类。测试类是使用Fluent接口模式编写的,这使它们更可读和可维护。

该框架还包括一个报告生成器,该生成器为测试结果创建交互式和详细的报告。报告包括诸如测试名称,测试状态和测试步骤之类的信息。

此框架可用于任何Web应用程序的UI自动化测试。我相信它也将成为其他开发人员的宝贵工具。

框架详细信息

测试申请

对于此框架,我使用ClearTrip作为样品飞行/酒店预订网站。

框架 - 什么,为什么?

一个框架是一种已有的代码库,可提供共同的功能并解决软件需求的基本任务。通过在框架之上构建,开发人员可以专注于解决特定要求而无需重新发明轮子。所选框架是实施特定项目的软件要求的基础。

项目结构

该项目遵循标准目录结构。页面类和相关文件位于src/main/java/com/cleartrip/casestudy路径中,而测试类和相关文件可以在src/test/java/com/cleartrip/casestudy路径中找到。这种分离允许更好的组织和可维护性。

框架的主要特征:

  • 每个正在测试的页面的页面类,利用PageFactory模型查找和初始化Web元素。
  • 测试类创建页面类实例以访问其方法,将测试从页面元素分离。
  • WebDriver的静态实例化,以确保在所有测试类中仅共享一个实例。
  • 相关依赖关系和插件在pom.xml文件中定义。

软件包

主包

src/main/java/软件包包含核心框架代码。所有页面类别和相关文件都位于此主包中。可以在<working-dir>/doc/index.html的Javadoc中找到详细的文档。

测试包

src/test/java/软件包包含实际的测试类。子包com.cleartrip.casestudy.tests保存了与ClearTrip应用程序相关的所有测试测试类。这些测试类的Javadoc可以在<working-dir>/doc/com/cleartrip/casestudy/tests/package-summary.html上找到。

报告

在范围内,我们可以为UI测试结果生成交互式和详细的报告。可以在workingDir/ExtentReports/ExtentReportResults.html中找到测试报告。

安装

要在本地系统上设置并运行UI自动化框架,请执行以下步骤:

在本地系统中设置硒的步骤:

1。安装Java:

  • 检查Java是否已通过在终端中运行java -versionjavac -version安装。
  • 如果没有安装Java或存在过时的版本,请安装最新的Java开发套件(JDK)。

2。安装日食或任何其他最新IDE:

  • 下载日食安装程序并运行它。
  • 选择为Java开发人员安装Eclipse的选项。
  • 打开Eclipse Workbench。

3。获取代码库:

  • 克隆来自GitHubselenium-pom-factory-fluent-pattern存储库。

4。在Eclipse中设置项目:

  • 开放日食,转到File -> Open Project from File System
  • 浏览克隆的项目文件夹并打开它。
  • 通过进入Help -> Eclipse Marketplace->搜索testng并在安装后安装并重新启动蚀。
  • 默认情况下应提供Maven插件。要验证,请右键单击项目,并检查是否有一个名为“ Maven”的选项。

可能的问题:

  • 如果pom.xml文件中存在错误,请尝试以下步骤:
    • 打开终端并导航到Users/<profile_name>/.m2
    • Run rm -r repository.
    • 右键单击项目,然后选择“更新项目”。
  • 如果所有导入语句中都有错误,请尝试以下步骤:
    • 单击src/main/java文件夹,转到Build Path,然后从构建路径中删除。
    • 单击src -> main -> java,右键单击,转到Build Path,然后选择“用作源文件夹”。
    • 刷新项目。

5。设置验证:

  • 在测试软件包中,右键单击任何Java文件,然后选择“作为testng测试运行”。

简单的示例测试

让我们开始以一个简单的示例,即使用页面工厂/流利接口模式为飞行预订进行测试。

测试步骤:

  1. Go to www.cleartrip.com.
  2. 选择旅行类型(单向旅行)。
  3. 选择原点(班加罗尔)。
  4. 选择目标(德里)。
  5. 选择一个日期(任何随机日期)。
  6. 单击“搜索”按钮。

请参阅下图以了解不同应用程序页面的页面类和测试类:

Package Structure

步骤1:创建页面类

我们需要为ClearTrip站点中的所有已实现页面创建页面对象:HomePage.javaFlightResultsPage.javaHotelResultsPage.javaHotelsPage.javaSignInPopup.java。这些页面类将在测试类中用于执行操作和断言。

让我们考虑以下方案:在主页上,用户选择“飞行预订”选项,输入有效的详细信息,然后单击搜索按钮,该按钮将它们重定向到飞行结果页面。

主页的示例页面类(HomePage.java):

public class HomePage {
    private WebDriver driver;
    private WebDriverWait wait;

    @FindBy(xpath = "//nav[@class='row fieldRow tripType']")
    private WebElement tripType;

    @FindBy(id = "FromTag")
    private WebElement origin;

    // Other web elements and methods...

    public HomePage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
        wait = new WebDriverWait(driver, WaitTimes.TIME_5_SECONDS.getWaitTime());
    }


    // Methods for interacting with the elements and performing actions on the Home page...

    /**
     * This method launches the home page
     */
    public HomePage launch() {
        driver.get("https://www.cleartrip.com/");
        return this;
    }

    /**
     * This method selects the trip type
     *
     * @param tripTypeOption Value of Trip Type
     */
    public HomePage selectTripType(String tripTypeOption) {
        tripType.findElement(By.xpath("//input[@value='" + tripTypeOption + "']")).click();
        return this;
    }

    /**
     * This method selects the place of origin
     *
     * @param origin Value of Origin
     */
    public HomePage selectOrigin(String origin) {
        this.origin.clear();
        this.origin.sendKeys(origin);
        wait.until(ExpectedConditions.visibilityOfAllElements(originOptions));
        originOptions.get(Indices.INDEX_0.getIndexValue()).click();
        return this;
    }

    /**
     * This method clicks on the search button after
     */
    public FlightResultsPage clickSearchButton() {
        searchButton.click();
        return new FlightResultsPage(driver);
    }

    /**
     * This method clicks on the "Hotels" link in the home page
     */
    public HotelsPage clickHotelsLink() {
        hotelLink.click();
        return new HotelsPage(driver);
    }

    /**
     * This method clicks on the SignIn option which appears after clicking the "Your Trips" options
     */
    public SignInPopup clickSignInOption() {
        signIn.click();
        return new SignInPopup(driver);
    }

}

在上面的示例中,我们为ClearTrip主页创建了一个页面类。它包含与主页相关的必要的Web元素和操作方法,使用PageFactory模型初始化。

请注意,这只是一个示例,您需要为应用程序中的其他页面创建类似的页面类。

步骤2:创建一个测试库类

创建一个在所有测试类中扩展的基本测试类。因此,将WebDriver实例化,以使其是静态的,并且将在所有测试类中创建和共享一个实例。驾驶员只有完成所有测试后才退出。

testbase.java

/**
 * Base Test Class which is extended Test Classes
 */
public abstract class TestBase {

    /**
     * Static WebDriver Instance
     */
    protected static WebDriver driver;


    public WebDriver getDriver() {
        return driver;
    }

    /**
     * Suite level setup method where the static instance of the WebDriver is instantiated
     */
    @BeforeSuite
    public static void initDriver() {

        WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();

    ChromeOptions options = new ChromeOptions();

        // The following statement sets the argument to disable notification in chrome when executing the tests
        options.addArguments("--disable-notifications");
        driver = new ChromeDriver(options);
        driver.manage().window().maximize();
    }


    /**
     * Suite level tear-down method to quit the WebDriver instance
     */
    @AfterSuite
    public void quitDriver() {
        driver.quit();
    }
}

步骤3:创建一个测试类

在测试类中,将创建页面类的实例以访问页面类中的方法。因此,测试与所测试的页面/元素分离。这使框架更加可维护。

因此,在此FlightBookingTest类中,我们必须创建主页的对象,FlightresultSpage才能访问这些页面中可用的方法。

FlightBookingTest.java

/**
 * Class containing test for validating search-flight results
 */
public class FlightBookingTest extends TestBase {

    /**
     * Instance of HomePage class
     */
    private HomePage homePage;

    /**
     * Instance of FlightResultsPage class
     */
    private FlightResultsPage flightResultsPage;

    /**
     * Class level test-Setup method that intantiates {@link HomePage} and {@link FlightResultsPage}
     */
    @BeforeClass
    public void testClasSetup() {
        homePage = new HomePage(driver);
        flightResultsPage = new FlightResultsPage(driver);
    }

    /**
     * Test method for verifying whether search summary is rightly displayed when searching for flights
     */
    @Test
    public void testThatResultsAppearForAOneWayJourney(Method method) {

        ExtentTestManager.startTest(method.getName(), "Test method for verifying whether search summary is rightly displayed when searching for flights");

        ExtentTestManager.getTest().log(LogStatus.INFO, "Launching the browser");
        homePage.launch() 
            .selectTripType(TripTypes.ONE_WAY.getTripType())
            .selectOrigin(Cities.BANGALORE.getCity())
            .selectDestination(Cities.Delhi.getCity())
            .selectDate()
            .clickSearchButton();

        ExtentTestManager.getTest().log(LogStatus.INFO, "Asserting flight search summary details");
        Assert.assertTrue(
                flightResultsPage.isSearchSummaryAvailable(),
                "Search Summary is not available after clicking the Search Button when searching for flights");
    }


}

在上面的示例中,我们创建一个测试类FlightBookingTest,该类别使用HomePage页面在ClearTrip网站的主页上执行操作,然后在飞行结果页面上断言或执行进一步的操作。

步骤4:进行测试

运行测试,右键单击测试类FlightBookingTest,然后选择“作为测试测试”。这将执行测试步骤并在控制台中显示测试结果。

范围HTML Report

可以在workingDir/ExtentReports/ExtentReportResults.html

中找到测试报告

测试摘要

alt text

特定的测试细节

alt text

结论

该框架提供了一种用于创建页面类,测试类并使用范围报告生成交互式测试报告的构造结构。

通过遵循安装步骤和提供的示例,您可以在本地系统上设置框架并开始为Web应用程序创建UI自动化测试。

有关对每个组件和完整源代码的更详细的了解,请参阅GitHub repository