【问题标题】:Pagefactory init elements function to be declared once in code for code optimizationPagefactory init 元素函数要在代码中声明一次以进行代码优化
【发布时间】:2020-02-07 10:46:22
【问题描述】:

我正在使用页面对象模型自动化我的项目。但是我注意到,每当我为同一个页面对象编写两个不同的场景以实现自动化时,每次使用 Pagefactory.initElements 方法编写测试用例时,我都需要为该测试用例初始化元素。有什么办法可以只初始化一次并且可以在所有测试用例中重用?

我试图制作参考变量,例如“manorgpom ort=PageFactory.initElements(getdriver(), manorgpom.class);” ort 是静态的,但它给出了空指针异常。我在测试用例之外对它们进行了初始化,并将引用变量设为静态但没有成功。

    @Test(priority=3)
public void orgact() throws Exception {
    manorgpom ort=PageFactory.initElements(getdriver(), manorgpom.class);
    getdriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    ort.actorg();
    Thread.sleep(5000);
}

@Test(priority=4)
public void orgadd() throws Exception{
    manorgpom ort=PageFactory.initElements(getdriver(), manorgpom.class);
    getdriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    ort.addorg();
    Thread.sleep(10000);
}

如果您在上面看到,我每次编写测试用例时都需要初始化 Web 元素。每次我需要提到“manorgpom ort=PageFactory.initElements(getdriver(), manorgpom.class);”。我想优化这个。

这是 manageorgpom 类 sn-p。

    public class manorgpom extends Basetest{
@FindBy(xpath="//*[@href='/organization']")
WebElement orglink;

@FindBy(xpath="//*[@class='anticon anticon-filter']")
WebElement filter;

@FindBy(xpath="//*[@placeholder='e.g. High School USA']")
WebElement filternametxt;

@FindBy(xpath="//*[text()='Activate']")
WebElement activatelink;

@FindBy(xpath="//*[@placeholder='e.g. Johnny']")
WebElement contactfirstname;

当我将 ort 引用变量设为静态时,每次运行套件时都会收到 java.lang.nullPointerException。请帮帮我。

【问题讨论】:

  • 在页面类构造函数中添加 PageFactory.initElements 可能会有所帮助。你能提供更多细节吗?
  • 正是您需要的?能详细点吗?
  • 您是否尝试过初始化元素和页面对象级别?你能分享你的页面对象类详细信息吗
  • 我在声明所有网络元素的地方添加了 sn-p。
  • 您的 getdriver() 是否每次都创建新的驱动程序对象?

标签: selenium-webdriver testng-eclipse page-factory


【解决方案1】:

那是因为您的 webDriver 每次都会被实例化。您需要将其设为单例并仅使用 webDriver 的一个实例。

public class driverSingleton { 
private static final webDriver instance = new ChromeDriver();   //just for example 
//private constructor to avoid client applications to use constructor private EagerInitializedSingleton(){} 
public static driverSingleton getInstance(){ return instance;

} 

【讨论】:

  • 您能否添加一些代码以更好地表达您的意思?
  • public class driverSingleton { private static final webDriver instance = new ChromeDriver(); //仅举例 //私有构造函数以避免客户端应用程序使用构造函数 private EagerInitializedSingleton(){} public static driverSingleton getInstance(){ return instance; } }
  • 现在使用 getInstance 获取驱动程序实例并使用它。这应该可以解决您的问题
  • 请不要将代码放入 cmets,而是编辑您的答案以增强它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多