Java 如何让Graphene加载我的@页面?
TL;DR:如何告诉Graphene为@Page注入对象加载哪个(相对)URLJava 如何让Graphene加载我的@页面?,java,selenium-webdriver,jboss-arquillian,graphene2,arquillian-drone,Java,Selenium Webdriver,Jboss Arquillian,Graphene2,Arquillian Drone,TL;DR:如何告诉Graphene为@Page注入对象加载哪个(相对)URL 我正在尝试使用“最新技术”来设置我的web前端集成测试,即Arquillian、Arquillian无人机、Selenium 2和Graphene 2的组合 使用Arquillian、Drone和普通Selenium WebDriver(即不含任何石墨烯特定材料),测试可以如下所示: import org.jboss.arquillian.container.test.api.Deployment; import
我正在尝试使用“最新技术”来设置我的web前端集成测试,即Arquillian、Arquillian无人机、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);
}
}
(由于包覆面提取的文档不是最新的,所以我花了一段时间才正确部署。)
这个简单的测试只是检查我们是否从主页重定向到登录页面,以及它的标题是否正确有效。
石墨烯2增加了一个重要的新特性。然后,我的测试可以如下所示(省略导入和部署部分,如上所述):
使用此“页面抽象”对象:
这实际上是可行的,我的测试没有失败,甚至输出了正确的标题。
但这根本不起作用(我不知道为什么我似乎认为它起作用,我一定看过上一次测试的输出)
我得到了一个“org.openqa.selenium.NoSuchElementException:无法找到名为title的元素”,堆栈跟踪非常长(通过Arquillian、Graphene、Java反射API、Maven Surefire插件和我的两行代码)
对该方法的调试表明,它最终尝试访问Html元素,并且手头的HtmlPage是一个关于:blank的页面,而不是我的登录页面
它应该是这样工作的吗?为什么对我不起作用
然后,我想测试登录页面以外的其他页面,为此,我需要使用其他起始URL
使用普通无人机+Selenium Webdriver,我只需使用
driver.get(deploymentUrl + "/otherPage");
作为测试的第一行。但如何处理Graphene2@Page注释呢
我如何告诉Graphene为@Page注入对象加载哪个URL(相对于deploymentUrl)?我个人使用继承和泛型来实现这一点(但这可能不是最好的解决方案)。你可以举个例子。您需要这样定义抽象页面
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());
}
}
公共接口抽象页面{
公共抽象字符串getURL();
}
@RunWith(Arquillian.class)
公共抽象类AbstractWebDriverTest{
@页面
私人网页;
@以前
公共无效goToUrl(){
get(deploymentURL+page.getURL());
}
}
然后每个测试类将使用
中指定的页面实现抽象页面
。看看这个示例项目,我希望这会有所帮助 该行为是预期的。Graphene初始化页面对象字段
要自动加载页面,可以将页面对象的位置封装在@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
自动加载。
有关此功能的更多信息,请访问。以便在@page注释填充页面之前执行gotour?但是在创建页面对象之后?我很难理解这一点,但我会尝试一下。这取决于,@Before
将在测试之前执行(所以是的-在加载页面对象之前),@Before
当然是在:)还要注意页面对象是惰性加载的,Graphene在失败之前尝试加载WebElements几次。
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);
}