在我的 Selenium 自动化框架中,我们必须为每个
@Test
方法初始化页面类。为每个方法加载所有页面类需要花费太多时间。
这是代码片段:
public void presetup() {
class1 = CustomPageFactory.initElements(Class1.class);
class2 = CustomPageFactory.initElements(Class2.class);
class3 = CustomPageFactory.initElements(Class3.class);
}
此
presetup()
方法将在每个 @Test
方法之前执行。我们为每个测试初始化大约 15 个类。它影响我的整体测试执行时间。尤其是当我们在网格环境上运行案例时,需要花费大量时间。
我们有任何解决方法来减少页面对象模型中的执行时间吗?
有什么替代方法可以花费更少的时间来初始化页面对象吗?
您可以尝试对页面对象初始化进行延迟初始化。 这里,不需要按照预设方式初始化页面对象。只需初始化变量,而不是在需要时初始化。接下来,为每个页面类的初始化开发一个单独的方法。
这是代码的改进版本,其中包含其他注释,以便更好地理解:
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");
}
}
BasePage 类:
设置页面类:
settingsPageObjects
和 loginPageObjects
在构造函数中初始化为 null
。getLoginPageObjects()
和getSettingsPageObjects()
方法仅在第一次访问页面对象时才初始化它们。这就是延迟初始化的本质。PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), pageObject)
方法用于初始化页面对象,查找元素的超时时间为10秒。您可以根据需要调整此超时。finalizeObjects()
方法将页面对象设置为null
,这有助于在不再需要它们时清除内存。在测试中使用设置页面:
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();
}
}
这种方法应该有助于减少加载页面类所需的时间并提高测试自动化框架的性能。