TL;DR:我如何告诉 Graphene 为 @Page-injected 对象加载哪个(相对)URL?
我正在尝试使用“最先进的技术”设置我的 Web 前端集成测试,即 Arquillian、Arquillian Drone、Selenium 2 和 Graphene 2 的组合。
使用 Arquillian、Drone 和普通的 Selenium 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);
}
}
(由于 ShrinkWrap 的文档不是最新的,我花了一段时间才正确部署。)
这个简单的测试只是检查我们是否从主页重定向到登录页面,并且它的标题是否正确。有用。
Graphene 2 添加了一个重要的新功能,“自动装配”页面抽象。然后我的测试可能看起来像这样(省略上面的导入和部署部分):
@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: Unable to locate element with name: title”,堆栈跟踪非常长(通过所有 Arquillian、Graphene、Java Reflection API、Maven Surefire 插件和我的两行代码)。
调试方法显示它最终尝试访问 Html-Element,而手头的 HtmlPage 是一个about:blank
-page,而不是我的登录页面。
这是它应该如何工作的吗?为什么它对我不起作用?
然后我想测试登录页面以外的其他页面,为此我需要使用其他起始 URL。
使用普通的 Drone+ Selenium Webdriver,我会简单地使用
driver.get(deploymentUrl + "/otherPage");
作为测试的第一行。但是如何处理 Graphene 2 @Page-Annotation?
如何告诉 Graphene 为 @Page-injected 对象加载哪个 URL(相对于 deploymentUrl)?