如何在Java Selenium中使用类型对象传递页面元素
我使用以下方法为C中的页面加载页面工厂元素。我想在Java中做类似的事情。有人知道我该怎么做吗 这是Pages.cs文件:如何在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() {
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);
}
}