gpt4 book ai didi

java - 我如何告诉 Graphene 加载我的@Page?

转载 作者:行者123 更新时间:2023-12-02 04:17:51 26 4
gpt4 key购买 nike

TL;DR:我如何告诉 Graphene 为 @Page 注入(inject)的对象加载哪个(相对)URL?

<小时/>

我正在尝试使用“最先进的技术”(即 Arquillian、Arquillian Drone、Selenium 2 和 Graphene 2 的组合)来设置我的 Web 前端集成测试。

使用 Arquillian、Drone 和普通 Selenium WebDriver(即没有任何 Graphite 烯特定的东西),测试可能如下所示:

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 的文档不是最新的,我花了一段时间才正确部署。)

这个简单的测试只是检查我们是否从主页重定向到登录页面,以及其标题是否正确。 有效。

Graphite 烯 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:无法定位名称为标题的元素”,并且堆栈跟踪非常长(通过所有 Arquillian、Graphene、Java Reflection API、Maven Surefire 插件和两行我的代码)。

对该方法进行调试表明它最终尝试访问 Html-Element,并且手头的 HtmlPage 是一个 about:blank 页面,而不是我的登录页面。

这是它应该如何工作的吗?为什么它对我不起作用?

然后我想测试登录页面之外的其他页面,为此我需要使用其他起始 URL。

对于普通的 Drone+ Selenium Webdriver,我只需使用

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

作为测试的第一行。但是如何使用 Graphene 2 @Page-Annotation 呢?

如何告诉 Graphene 为 @Page 注入(inject)的对象加载哪个 URL(相对于部署Url)?

最佳答案

该行为是预期的。 Graphite 烯初始化页面对象字段。

要自动加载页面,您可以将页面对象的位置封装在@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 阅读有关此功能的更多信息。 .

关于java - 我如何告诉 Graphene 加载我的@Page?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17812108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com