Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让Graphene加载我的@页面?_Java_Selenium Webdriver_Jboss Arquillian_Graphene2_Arquillian Drone - Fatal编程技术网

Java 如何让Graphene加载我的@页面?

Java 如何让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

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 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);
}