Java11嵌套类,同时将Fluent Design Structure用于代码

因此,我继承了一个自动化项目(基于Selenium / TestNG的JAVA11),他们希望对其进行重构,以将Fluent Design用于代码库,以便非编码人员更轻松地开始测试构建。有道理...但是...他们在整个页面地图工厂中都使用了嵌套JAVA类,并且仍然希望保持这种状态。

我对C#很好,但对JAVA和嵌套类的了解却不多。以下是我正在谈论的示例。他们基本上希望使用Fluent设计,因此,如果需要访问嵌套类,则可以在父类的using事件中调用它,这样就不会影响链。

我到处都在寻找Selenium的例子,但是很难找到一些例子。感谢您的协助。

\\Code Base

public class UserAdminPage
{
    @SuppressWarnings("unused")
    private static WebElement element = null;

    public UserAdminPage(RemoteWebDriver driver)
    {
        PageFactory.initElements(driver,this);
    }

    public static UserAdminPage using(RemoteWebDriver driver) 
    {
        return new UserAdminPage(driver);
    }

    public static class AddEditUserInformation
    {
        @FindBy(name = "firstName")
        public WebElement FirstName_txtbx;
        public UserAdminPage FirstName_txtbx(String firstname)
        {
            this.FirstName_txtbx.sendKeys(firstname);
            return this;
        }       

        @FindBy(name = "lastName")
        public WebElement LastName_txtbx;
        public AddEditUserInformation LastName_txtbx(String lastname)
        {
            this.LastName_txtbx.sendKeys(lastname);
            return this;
        }

    }

    @FindBy(id = "accountsList")
    public WebElement accountName_dropdwn;
    public void accountName_dropdwn()
    {
        this.accountName_dropdwn.click();
    }

    @FindBy(id = "Save_button")
    public WebElement Save_btn;
    public void Save_btn()
    {
        this.Save_btn.click();
    }


}

\\Test Event
UserAdminPage.using(driver).accountName_dropdwn()
                           .AddEditUserInformation.FirstName_txtbx("John")
                           .AddEditUserInformation.LastName_txtbx("Doe")
                           .Save_btn()
nannannnn 回答:Java11嵌套类,同时将Fluent Design Structure用于代码

静态公共内部类实际上是一个完全独立的类,很容易就可以放在另一个文件中。

您正在调用AccountName_dropdwn,然后尝试在其返回值(无效)上调用方法。您尝试调用的方法是AddEditUserInformation.FirstName_txtbx,但这是AddEditUserInformation的(非静态)成员函数,因此只能在该类的实例上调用。您不会在代码中创建代码。

如果我认为方法AccountName_dropdwn返回一个AddEditUserInformation对象,则您的代码可能会起作用。我认为方法名称的不必要限定不会阻止其工作,但是这种情况非常罕见,我不确定。

,

正如Zag在他的回答中指出的那样,您所谈论的“嵌套类”实际上是“常规类”(因为它们是静态的),这里唯一不寻常的是它们与其他类放置在同一文件中

除非您愿意做出一些牺牲,否则您不能使用没有共同点的类(没有共同的接口,不使用泛型)来进行良好的“流畅设计”。下面的代码显示了使用“ on”方法的折衷方案:有一个链,但是您需要手动将链从使用一个类移到另一个类(这通常是一个好的“流利设计”将隐藏并自动完成的工作)您,因此您不必考虑它。)

请注意,下面的代码可以编译并可以执行(通过“ main”方法执行)-这是在可能的情况下如何在问题中显示代码的方式。

package so;
public class UserAdminPage {

    public static void main(String[] args) {

        // test code
        System.out.println("Start test.");
        UserAdminPage.using(new RemoteWebDriver())
            .AccountName_dropdwn()
            .onAddEditUserInformation()
            .FirstName_txtbx("John")
            .LastName_txtbx("Doe")
            .onUserAdminPage()
            .Save_btn();
        System.out.println("Finished test.");
    }

    public static UserAdminPage using(RemoteWebDriver driver) {
        return new UserAdminPage(driver);
    }

    private WebElement AccountName_dropdown = new WebElement();
    private WebElement Save_btn = new WebElement();

    public UserAdminPage(RemoteWebDriver driver) {
        PageFactory.initElements(driver,this);
    }

    public UserAdminPage AccountName_dropdwn() {
        AccountName_dropdown.click();
        return this;
    }

    public UserAdminPage Save_btn() {
        Save_btn.click();
        return this;
    }

    public AddEditUserInformation onAddEditUserInformation() {
        return new AddEditUserInformation(this);
    }

    // nested class

    public static class AddEditUserInformation {

        private UserAdminPage page;

        public WebElement FirstName_txtbx = new WebElement();
        public WebElement LastName_txtbx = new WebElement();

        public AddEditUserInformation(UserAdminPage page) {
            this.page = page;
        }

        public AddEditUserInformation FirstName_txtbx(String firstname) {
            this.FirstName_txtbx.sendKeys(firstname);
            return this;
        }       

        public AddEditUserInformation LastName_txtbx(String lastname) {
            this.LastName_txtbx.sendKeys(lastname);
            return this;
        }

        public UserAdminPage onUserAdminPage() {
            return page;
        }
    }

    // external classes

    public static class WebElement {
        public void sendKeys(String keys) {}
        public void click() {}
    }
    public static class RemoteWebDriver {}
    public static class PageFactory {
        public static void initElements(RemoteWebDriver driver,UserAdminPage page) {}
    }

}
本文链接:https://www.f2er.com/3135284.html

大家都在问