运行Java+Selenium+Cucumber测试出现OutOfMemoryError错误如何解决
问题根因
你出现OOM的核心原因是PageFactory.initElements调用参数错误引发的无限递归实例化:
当你调用PageFactory.initElements(driver, LandingPage.class)时,PageFactory会自动调用LandingPage的带WebDriver参数的构造方法创建新实例,而你的构造方法里又调用了initElements,这就形成了无限循环,不断创建LandingPage对象,最终堆内存耗尽,调大堆内存无法解决问题,因为递归循环不会终止。
修复方案
把LandingPage构造方法里的initElements调用参数修改即可,推荐使用第一种写法:
- 写法1:传入当前对象实例
this,不需要创建新实例,直接给当前对象的@FindBy注解字段赋值
public class LandingPage { WebDriver driver; public LandingPage(WebDriver driver) { this.driver=driver; // 把原来的LandingPage.class改成this PageFactory.initElements(driver, this); } @FindBy(xpath="//a[contains(@id,'accountList')]") WebElement account_dd; public void movemousetodropdown() { System.out.println("I am trying to move mouse"); Actions act = new Actions(driver); act.moveToElement(account_dd).build().perform(); } }
- 写法2:如果要用类作为参数,就把initElements调用放到构造方法外部,接收返回的实例,不要在构造方法内调用避免递归
// LandingPage构造方法内不调用initElements public LandingPage(WebDriver driver) { this.driver=driver; } // 步骤定义中初始化时直接接收initElements返回的实例 p1 = PageFactory.initElements(driver, LandingPage.class);
修改后运行测试即可解决内存溢出问题,同时@FindBy注解的元素也会正常初始化,鼠标悬浮操作可正常执行。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

