2015-02-09 22 views
0

我正在使用硒頁面對象模式,並試圖將可加載組件納入其中。我想有一個父頁面對象類,所有的頁面對象擴展自我的常用方法。使用基頁面對象擴展可裝載組件

我很努力使這個工作沒有得到一個Java內存不足的錯誤。當我調試我得到以下錯誤

org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array. 

在測試結束時沒有堆棧跟蹤只是內存不足的錯誤。

所以我父頁面對象類如下(搜索之後,這是它沒有拋出一個編譯時錯誤的唯一方法)

public abstract class SeleniumPageObject<T extends SeleniumPageObject<T>> extends LoadableComponent<T> { 

    protected WebDriver driver; 

    protected void clearAndType(WebElement field, String text) { 
     field.clear(); 
     field.sendKeys(text); 
    } 

    protected String getPageTitle() { 
     return driver.getTitle(); 
    } 

} 

然後我有一個頁面對象(以下簡化)

package selenium.selenium_test; 

import org.junit.Assert; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 
import org.openqa.selenium.support.PageFactory; 


public class HomePage extends SeleniumPageObject { 

    private final static String baseUrl = "https://someUrl"; 
    //WebDriver driver; 

    @FindBy(css = "a[href*='tell-me-more']") 
    WebElement link_TellMeMore; 

    @FindBy(css = "a[href*='registration']") 
    WebElement link_Register; 


    public HomePage(WebDriver driver) { 
     super(); 
     this.driver = driver; 
     PageFactory.initElements(driver, HomePage.class); 
    } 

    @Override 
    protected void isLoaded() throws Error { 
     String url = driver.getCurrentUrl(); 
     Assert.assertTrue("Home page has not been loaded correctly", baseUrl.equals(url)); 
    } 

    @Override 
    protected void load() { 
     driver.get(baseUrl);   
    } 

    public RegisterPageOne clickRegisterLink() { 
     link_Register.click(); 
     return new RegisterPageOne(driver); 
    } 
} 

我的測試類是非常簡單,它有這行代碼在我的方法

driver = new FirefoxDriver(); 
HomePage homePage = new HomePage(driver); 

WHE我打到它掛起的頁面,然後拋出錯誤。我只能認爲我錯誤地使用了泛型。

任何一個幫助我做錯了什麼?在此先感謝

UPDATE:

我也改變了類簽名下方,但仍得到了同樣的錯誤

public class HomePage extends SeleniumPageObject<HomePage> 

我也做了一些更多的調試到代碼,它是以下行在引發運行時異常的PageFactory方法中。當它試圖創建我的主頁類的新實例。將頁面類代理參數作爲類selenium.selenium_test.HomePage傳入,並找到該類的構造函數。

private static <T> T instantiatePage(WebDriver driver, Class<T> pageClassToProxy) 
Constructor<T> constructor = pageClassToProxy.getConstructor(WebDriver.class); 
return constructor.newInstance(driver); 

下面是我從Maven運行測試時得到的堆棧跟蹤。從Eclipse直接運行時,只輸出前五行。

java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOfRange(Arrays.java:2694) 
    at java.lang.String.<init>(String.java:203) 
    at java.lang.StringBuffer.toString(StringBuffer.java:561) 
    at java.io.StringWriter.toString(StringWriter.java:210) 
    at org.junit.runner.notification.Failure.getTrace(Failure.java:76) 
    at org.apache.maven.surefire.common.junit4.JUnit4StackTraceWriter.writeTrimmedTraceToString(JUnit4StackTraceWriter.java:69) 
    at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:317) 
    at org.apache.maven.surefire.booter.ForkingRunListener.toString(ForkingRunListener.java:250) 
    at org.apache.maven.surefire.booter.ForkingRunListener.testError(ForkingRunListener.java:127) 
    at org.apache.maven.surefire.common.junit4.JUnit4RunListener.testFailure(JUnit4RunListener.java:110) 
    at org.junit.runner.notification.SynchronizedRunListener.testFailure(SynchronizedRunListener.java:63) 
    at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:142) 
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72) 
    at org.junit.runner.notification.RunNotifier.fireTestFailures(RunNotifier.java:138) 
    at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:132) 
    at org.junit.internal.runners.model.EachTestNotifier.addFailure(EachTestNotifier.java:23) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:329) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
+0

發表您的完整代碼 - 至少,我們需要看到PageFactory.initElements() – Dave 2015-02-09 12:08:53

+0

更新了家頁面代碼並添加了我的測試類代碼 – user1107753 2015-02-09 13:17:36

+0

我仍然看不到PageFactory代碼... – Dave 2015-02-09 13:44:40

回答

0

對於同樣的問題,改變PageFactory線以下的人解決問題

PageFactory.initElements(driver, this);