方法返回两个java类

方法返回两个java类,java,selenium,testing,methods,Java,Selenium,Testing,Methods,我有两门课: public class UnoLoginPageUi { public final Input username = new Input("id=username"); public final Input password = new Input("id=password"); public final Button loginButton = new Button("name=login"); } 及 在一个普通类中,我想做这样的东西: public

我有两门课:

public class UnoLoginPageUi {
    public final Input username = new Input("id=username");
    public final Input password = new Input("id=password");
    public final Button loginButton = new Button("name=login");
}

在一个普通类中,我想做这样的东西:

public void loginUsingUsernameAndPassword(String username, String password, String pageType) {
    getUi(pageType).username.waitForToBeDisplayed();
    getUi(pageType).username.setValue(username);
    getUi(pageType).password.setValue(password);
    getUi(pageType).loginButton.click();
}
其中getUi()是一个方法,该方法使用gas参数pageType(即UNO或DUO)


然而,它不工作,因为这种方法需要在这两个带有选择器的页面类型-如何处理

您可以创建一个名为LoginPageUi的接口。让您的UnoLoginPageUi和DuoLoginPageUi实现该接口

然后您的getUi方法将是
private-LoginPageUi-getUi(String-pageType)


离题:我建议实现枚举而不是字符串页面类型。

您可以创建一个名为LoginPageUi的接口。让您的UnoLoginPageUi和DuoLoginPageUi实现该接口

然后您的getUi方法将是
private-LoginPageUi-getUi(String-pageType)


离题:我建议实现枚举而不是字符串pageType。

为两个被调用的UI创建父类或接口:

public abstract class Ui{
}

public interface Ui{
}
并将其扩展:

public class UnoLoginPageUi extends Ui{
  public final Input username = new Input("id=username");
  public final Input password = new Input("id=password");
  public final Button loginButton = new Button("name=login");
}

public class DuoLoginPageUi extends Ui {
  public final Input username = new Input("id=usernameField");
  public final Input password = new Input("id=passwordField");
  public final Button loginButton = new Button("id=submitButton");
}

然后将父引用返回为:

private Ui getUi(String pageType) {
if (pageType.equals("UNO")) {
    return new DuoLoginPageUi();
}
else if (pageType.equals("DUO")) {
    return new UnoLoginPageUi;
}
return null;
}

为两个被调用的UI创建父类或接口:

public abstract class Ui{
}

public interface Ui{
}
并将其扩展:

public class UnoLoginPageUi extends Ui{
  public final Input username = new Input("id=username");
  public final Input password = new Input("id=password");
  public final Button loginButton = new Button("name=login");
}

public class DuoLoginPageUi extends Ui {
  public final Input username = new Input("id=usernameField");
  public final Input password = new Input("id=passwordField");
  public final Button loginButton = new Button("id=submitButton");
}

然后将父引用返回为:

private Ui getUi(String pageType) {
if (pageType.equals("UNO")) {
    return new DuoLoginPageUi();
}
else if (pageType.equals("DUO")) {
    return new UnoLoginPageUi;
}
return null;
}

为这两个类创建一个公共抽象

public abstract class LoginPageUi {
    public final Input username = new Input("id=username");
    public final Input password = new Input("id=password");
    public final Button loginButton = new Button("name=login");        
}
并让
UnoLoginPageUi
DuoLoginPageUi
扩展

public class UnoLoginPageUi extends LoginPageUi {
    public static String getPageType() { return "UNO"; }
}

public class DuoLoginPageUi extends LoginPageUi {
    public static String getPageType() { return "DUO"; }
}
该方法将返回公共抽象

private LoginPageUi getUi(String pageType) {
    if (pageType.equals(DuoLoginPageUi.getPageType())) {
        return new DuoLoginPageUi();
    }
    else if (pageType.equals(UnoLoginPageUi.getPageType())) {
        return new UnoLoginPageUi;
    }
    return null;
}
我还希望您意识到,每次调用
getUi(pageType)
时,它都会返回一个新实例。当您调用
getUi(pageType).loginButton.click()时返回的实例未设置任何值

重构:

public void loginUsingUsernameAndPassword(String username, String password, String pageType) {
    LoginPageUi ui = getUi(pageType);
    if (ui != null) {
        ui.username.waitForToBeDisplayed();
        ui.username.setValue(username);
        ui.password.setValue(password);
        ui.loginButton.click();
    }
}

为这两个类创建一个公共抽象

public abstract class LoginPageUi {
    public final Input username = new Input("id=username");
    public final Input password = new Input("id=password");
    public final Button loginButton = new Button("name=login");        
}
并让
UnoLoginPageUi
DuoLoginPageUi
扩展

public class UnoLoginPageUi extends LoginPageUi {
    public static String getPageType() { return "UNO"; }
}

public class DuoLoginPageUi extends LoginPageUi {
    public static String getPageType() { return "DUO"; }
}
该方法将返回公共抽象

private LoginPageUi getUi(String pageType) {
    if (pageType.equals(DuoLoginPageUi.getPageType())) {
        return new DuoLoginPageUi();
    }
    else if (pageType.equals(UnoLoginPageUi.getPageType())) {
        return new UnoLoginPageUi;
    }
    return null;
}
我还希望您意识到,每次调用
getUi(pageType)
时,它都会返回一个新实例。当您调用
getUi(pageType).loginButton.click()时返回的实例未设置任何值

重构:

public void loginUsingUsernameAndPassword(String username, String password, String pageType) {
    LoginPageUi ui = getUi(pageType);
    if (ui != null) {
        ui.username.waitForToBeDisplayed();
        ui.username.setValue(username);
        ui.password.setValue(password);
        ui.loginButton.click();
    }
}


添加更多关于如何从这两个类调用方法的细节。我们的问题只包含codeCreate,即每个类实现的接口。将该接口用作返回类型。另外,对页面类型使用枚举而不是字符串。错误是什么<代码>返回新的UnoLoginPageUi需要()顺便说一句。如果你这样做,你需要每次检查类型。为这些UI类创建一个包装器,并从包装器扩展它们。因此,您可以使用此类型,并在需要时简单地执行null检查和强制转换。将返回类型(当前为
Class
)替换为
Object
),您可以在代码上使用接口添加更多详细信息,说明如何从这两个类调用方法。我们的问题只包含codeCreate,即每个类实现的接口。将该接口用作返回类型。另外,对页面类型使用枚举而不是字符串。错误是什么<代码>返回新的UnoLoginPageUi需要()顺便说一句。如果你这样做,你需要每次检查类型。为这些UI类创建一个包装器,并从包装器扩展它们。因此,你可以使用这个类型,只需在需要时进行null检查并强制转换。将返回类型(当前
Class
替换为
Object
)你可以在你的代码上使用接口是的,这就是我要回答的:Dyup这就是我要回答的:DYour solution ok,但是你应该让
Ui
成为一个接口或抽象类,因为它没有任何行为或字段;由于密码字段是最终的,您不能更改它:)您必须删除字段的最终修饰符。这不是修饰符的错误,实际上,在我尝试像上面那样强制转换一些选择器之后,我只能执行。getClass或调用getUi()上的另一个函数但不是选择器。您的解决方案还可以,但您应该将
Ui
设置为接口或抽象类,因为它没有任何行为或字段。不幸的是,我不能这样设置:getUi(“DUO”).password.setValue(password);由于密码字段是最终的,您不能更改它:)您必须删除字段的最终修饰符。这不是修饰符的错误,实际上,在我尝试像上面那样强制转换一些选择器之后,我只能执行。getClass或调用getUi()上的另一个函数但不是选择器。