如何在Java Selenium中使用类型对象传递页面元素

如何在Java Selenium中使用类型对象传递页面元素,java,c#,selenium,Java,C#,Selenium,我使用以下方法为C中的页面加载页面工厂元素。我想在Java中做类似的事情。有人知道我该怎么做吗 这是Pages.cs文件: using System.Dynamic; using OpenQA.Selenium.Support.PageObjects; namespace Framework.Pages { public static class Pages { private static T GetPage<T>() where T : new() {

我使用以下方法为C中的页面加载页面工厂元素。我想在Java中做类似的事情。有人知道我该怎么做吗

这是Pages.cs文件:

using System.Dynamic;
using OpenQA.Selenium.Support.PageObjects;

namespace Framework.Pages
{
public static class Pages
{
    private static T GetPage<T>() where T : new()
    {
        var page = new T();
        PageFactory.InitElements(Browser.Driver, page);
        return page;
    }


    public static RegistrationPage RegistrationPage
    {
        get { return GetPage<RegistrationPage>(); }
    }
    public static NavigationLinks NavigationLinks
    {
        get { return GetPage<NavigationLinks>(); }
    }
}
}
类似于没有任何实例化的测试行。当我调用Pages.NavigationLinks时。它会自动加载页面元素和方法


可以用Java创建这样的系统吗?

这就是在案例类中实例化泛型类型的方法:

public class Test{   
    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        Generic<T1> x = new Generic<T1>(T1.class);
        T1 y = x.buildOne();
    }
}

public class Generic<T>{
    private Class<T> clazz;

    public Generic(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    public T buildOne() throws InstantiationException,
        IllegalAccessException
    {
        return clazz.newInstance();
    }
}

public class T1{
    public T1(){
        System.out.println("This is T1 instance");
    }
}
。。。这是一个子类,您可以在其中设置其他元素,如输入、按钮等

public class PageObjectTest extends Page {
    @FindBy(id = "firstName")
    private WebElement inputFirstName;

    @FindBy(id = "lastName")
    private WebElement inputMiddleName;

    @FindBy(xpath = "//button[@type='submit']")
    private WebElement buttonSubmit;

    public PageObjectTest(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
    }
}

希望这能有所帮助。

如果可以,我建议您使用。从技术上讲,它不是Java,而是Groovy,但它运行在JVM上,是我测试和机器人程序的Selenium交互的首选。在这种情况下,你不必为主页使用工厂方法,你只需要对主页说“到主页”或者你想用它做的任何事情。谢谢你的评论。我不允许对所使用的软件/技术进行任何更改。我的公司更倾向于使用Selenium+Java使项目能够为未来的测试工程师维护。但我会看一下这个项目,看看它是如何运作的。我对这个答复感到困惑。也许我不能澄清我在做什么。如果你能再看看我的问题,我会很高兴的。也许这就是你想要的。我对回答感到困惑。也许我不能澄清我在做什么。如果你能再看看我的问题,我会很高兴。在我的答案的顶部,我给了你如何实例化泛型类的答案。在我回答的第二部分中,我提供了如何将PageObject模式应用于页面实例化。这样,您就可以更高效地处理页面,甚至可以在并发运行中创建页面,使页面可重用,易于维护。如果我把你弄糊涂了,我很抱歉,但是你必须把你的c代码调整得有点不同,@Grasshopper也做了一个有效的例子。我更新了我的问题。请看一看。我不能恰当地问我需要什么。或者不理解您的代码在没有实例化的情况下如何帮助我。
   public class Pages {
        private static<T> T getPage(Supplier<T> construct) {
                    T t = construct.get();
                    PageFactory.initElements(driver, t);
                    return t;
                }
       public static RegistrationPage getRegistrationPage() {
            return getPage(RegistrationPage::new);
              }
        }
public class PageObjectTest extends Page {
    @FindBy(id = "firstName")
    private WebElement inputFirstName;

    @FindBy(id = "lastName")
    private WebElement inputMiddleName;

    @FindBy(xpath = "//button[@type='submit']")
    private WebElement buttonSubmit;

    public PageObjectTest(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
    }
}
   public class Pages {
        private static<T> T getPage(Supplier<T> construct) {
                    T t = construct.get();
                    PageFactory.initElements(driver, t);
                    return t;
                }
       public static RegistrationPage getRegistrationPage() {
            return getPage(RegistrationPage::new);
              }
        }