2

TL; DR:如何告訴石墨烯爲哪個(相對)加載@頁面注入對象的URL?如何告訴石墨烯加載我的@頁面?


我試圖安裝使用的「先進」我的web前端集成測試,即一個的Arquillian,雄蜂的Arquillian,硒2和石墨烯2

用的Arquillian,雄蜂的組合和普通硒的webdriver(即沒有任何石墨烯具體的東西),測試可以是這樣的:

import org.jboss.arquillian.container.test.api.Deployment; 
import org.jboss.arquillian.container.test.api.RunAsClient; 
import org.jboss.arquillian.drone.api.annotation.Drone; 
import org.jboss.arquillian.junit.Arquillian; 
import org.jboss.arquillian.test.api.ArquillianResource; 

import org.jboss.shrinkwrap.api.spec.WebArchive; 
import org.jboss.shrinkwrap.resolver.api.maven.Maven; 

import org.junit.Assert; 
import org.junit.Test; 

import org.junit.runner.RunWith; 

import org.openqa.selenium.WebDriver; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@RunWith(Arquillian.class) 
public class LoginIT { 
    private static final Logger LOG = LoggerFactory.getLogger(LoginIT.class); 

    @Deployment 
    public static WebArchive createDeployment() { 

     return Maven.resolver().loadPomFromFile("pom.xml") 
        .resolve("de.zalando:purchasing-frontend-general:war:?") 
        .withoutTransitivity().asSingle(WebArchive.class); 
    } 

    @Drone 
    WebDriver driver; 

    @ArquillianResource 
    URL deploymentUrl; 

    @Test 
    @RunAsClient 
    public void testLoginPage() { 
     LOG.info("executing test!"); 

     driver.get(deploymentUrl + ""); 

     final String title = driver.getTitle(); 
     LOG.info("title: " + title); 
     Assert.assertEquals("Login page title is wrong", 
          "Zalando General Purchasing – Login", title); 
    } 
} 

(我花了一段時間才能部署正確的,因爲拆封非當前文檔。)

這個簡單的測試只是檢查我們是否從主頁重定向到登錄頁面,並且它的標題是正確的。 它的工作原理。

石墨烯2增加了一個重要的新功能,"autowiring" Page abstractions。然後我的測試可能看起來像這樣(忽略進口,並在上述展開部):

@RunWith(Arquillian.class) 
public class LoginIT { 
    private static final Logger LOG = LoggerFactory.getLogger(LoginIT.class); 

    @Deployment 
    public static WebArchive createDeployment() { 
     // as above 
    } 

    @Page 
    LoginPage loginPage; 


    @Test 
    @RunAsClient 
    public void testLoginPage() { 
     String title = loginPage.getTitle(); 
     LOG.info("title: " + title); 
     Assert.assertEquals("Login page title is wrong", 
          "Zalando General Purchasing – Login", title); 
    } 
} 

使用這種「頁面抽象」對象:

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

public class LoginPage { 

    @FindBy(tagName = "title") 
    private WebElement titleElement; 

    public String getTitle() { 
     return titleElement.getText(); 
    } 
} 

這實際工作,我的測試不失敗甚至輸出正確的標題。 但是這根本不起作用(我不知道爲什麼我好像認爲它是這樣,我一定看過前面測試的輸出)...

我得到一個「org.openqa .selenium.NoSuchElementException:無法通過名稱爲title的元素定位帶有非常長的堆棧跟蹤的元素(通過Arquillian,Graphene,Java Reflection API,Maven Surefire插件和我的兩行代碼)。

調試到該方法表明它最終嘗試訪問Html-Element,並且HtmlPage在手邊是一個about:blank頁面,而不是我的登錄頁面。

這是應該如何工作?爲什麼它不適合我?

然後我想測試除登錄頁面之外的其他頁面,爲此我需要使用其他起始URL。

帶滑動雄蜂+硒webdriver的,我會簡單地使用

driver.get(deploymentUrl + "/otherPage"); 

作爲測試的第一行。但是如何處理Graphene 2 @ Page-Annotation?

如何告訴石墨烯爲@頁面注入的對象加載哪個URL(相對於deploymentUrl)?

回答

2

我個人使用繼承和泛型來實現這一點(但它可能不是最好的解決方案)。您可以查找示例here。您需要定義自AbstractBase這樣

public interface AbstractPage { 

    public abstract String getURL(); 
} 

@RunWith(Arquillian.class) 
public abstract class AbstractWebDriverTest<P extends AbstractPage> { 

    @Page 
    private P page; 

    @Before 
    public void goToUrl() { 
     driver.get(deploymentURL + page.getURL()); 
    } 
} 

然後,每個測試類是要實現AbstractPage<>指定的頁面。看看這個示例項目,我希望這有助於!

+0

所以goToUrl將在頁面被@Page註解填充之前執行?但是在創建頁面對象之後?我很難理解這一點,但會嘗試一下。 –

+0

這取決於'@ Before'會在測試之前執行(所以是 - 在加載頁面對象之前),'@ After'當然是:)另外請注意,頁面對象是延遲加載的,Graphene嘗試在加載之前幾次加載WebElements它失敗。 –

5

該行爲是預期的。石墨烯初始化頁面對象字段。

要自動加載頁面,可以在@Location註釋中封裝頁面對象的位置。與@InitialPage一起,您可以實現所需的行爲。

你的頁面對象的聲明看起來像:

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 
import import org.jboss.arquillian.graphene.page.Location; 

@Location("login.html") 
public class LoginPage { 

    @FindBy(tagName = "title") 
    private WebElement titleElement; 

    public String getTitle() { 
     return titleElement.getText(); 
    } 
} 

您的測試:

@Test 
@RunAsClient 
public void testLoginPage(@InitialPage LoginPage loginPage) { 
    String title = loginPage.getTitle(); 
    LOG.info("title: " + title); 
    Assert.assertEquals("Login page title is wrong", 
         "Zalando General Purchasing – Login", title); 
} 

現在,login.html會自動加載相對你的contextRoot爲測試執行過程中的第一個動作。 你可以在documentation瞭解更多關於此功能的信息。

+0

+1用於保持頁面url上的測試類的清潔 –

相關問題