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)?
所以goToUrl將在頁面被@Page註解填充之前執行?但是在創建頁面對象之後?我很難理解這一點,但會嘗試一下。 –
這取決於'@ Before'會在測試之前執行(所以是 - 在加載頁面對象之前),'@ After'當然是:)另外請注意,頁面對象是延遲加載的,Graphene嘗試在加載之前幾次加載WebElements它失敗。 –