如何减少页面对象模型 Selenium 中初始化页面对象的时间

问题描述 投票:0回答:1

在我的 Selenium 自动化框架中,我们必须为每个

@Test
方法初始化页面类。为每个方法加载所有页面类需要花费太多时间。

这是代码片段:

public void presetup() {
    class1 = CustomPageFactory.initElements(Class1.class);
    class2 = CustomPageFactory.initElements(Class2.class);
    class3 = CustomPageFactory.initElements(Class3.class);
}

presetup()
方法将在每个
@Test
方法之前执行。我们为每个测试初始化大约 15 个类。它影响我的整体测试执行时间。尤其是当我们在网格环境上运行案例时,需要花费大量时间。

我们有任何解决方法来减少页面对象模型中的执行时间吗?

有什么替代方法可以花费更少的时间来初始化页面对象吗?

selenium selenium-webdriver selenium-grid
1个回答
0
投票

您可以尝试对页面对象初始化进行延迟初始化。 这里,不需要按照预设方式初始化页面对象。只需初始化变量,而不是在需要时初始化。接下来,为每个页面类的初始化开发一个单独的方法。

这是代码的改进版本,其中包含其他注释,以便更好地理解:

延迟初始化方法

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;

public class BasePage {
    protected WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }
}

public class SettingsPage extends BasePage {
    private SettingsPageObjects settingsPageObjects;
    private LoginPageObjects loginPageObjects;

    public SettingsPage(WebDriver driver) {
        super(driver);
        // Initialize the page objects as null
        settingsPageObjects = null;
        loginPageObjects = null;
    }

    private LoginPageObjects getLoginPageObjects() {
        if (loginPageObjects == null) {
            loginPageObjects = new LoginPageObjects();
            PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), loginPageObjects);
        }
        return loginPageObjects;
    }

    private SettingsPageObjects getSettingsPageObjects() {
        if (settingsPageObjects == null) {
            settingsPageObjects = new SettingsPageObjects();
            PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), settingsPageObjects);
        }
        return settingsPageObjects;
    }

    public void finalizeObjects() {
        loginPageObjects = null;
        settingsPageObjects = null;
    }

    public void disableNotification() {
        getSettingsPageObjects().notificationToggleField.click();
        ExtentReportManager.info("Notification toggle is clicked");

        getSettingsPageObjects().disableBtn.click();
        ExtentReportManager.pass("Notification 'Disable' button has been clicked in the popup");
    }
}

说明:

  1. BasePage 类

    • 该类作为所有页面类的父类。它确保 WebDriver 实例在所有页面类之间共享。
  2. 设置页面类

    • settingsPageObjects
      loginPageObjects
      在构造函数中初始化为
      null
    • getLoginPageObjects()
      getSettingsPageObjects()
      方法仅在第一次访问页面对象时才初始化它们。这就是延迟初始化的本质。
    • PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), pageObject)
      方法用于初始化页面对象,查找元素的超时时间为10秒。您可以根据需要调整此超时。
    • finalizeObjects()
      方法将页面对象设置为
      null
      ,这有助于在不再需要它们时清除内存。
  3. 在测试中使用设置页面

    • 在您的测试方法中,您现在可以使用
      SettingsPage
      和其他类似的类,而无需预先初始化所有页面对象的开销。

测试方法示例:

public class SettingsPageTest {
    private WebDriver driver;
    private SettingsPage settingsPage;

    @BeforeMethod
    public void setUp() {
        // Initialize WebDriver instance
        driver = new ChromeDriver();
        // Initialize the SettingsPage with WebDriver
        settingsPage = new SettingsPage(driver);
    }

    @Test
    public void testDisableNotification() {
        settingsPage.disableNotification();
    }

    @AfterMethod
    public void tearDown() {
        // Clear page objects to free up memory
        settingsPage.finalizeObjects();
        // Close WebDriver instance
        driver.quit();
    }
}

好处:

  • 延迟初始化:第一次访问时只初始化必要的页面对象。
  • 内存管理:页面对象在使用后可以被清除,有助于有效管理内存使用情况。
  • 性能改进:减少每个测试方法之前初始化所有页面对象所花费的时间,从而提高整体测试执行时间。

这种方法应该有助于减少加载页面类所需的时间并提高测试自动化框架的性能。

© www.soinside.com 2019 - 2024. All rights reserved.