首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java11嵌套类同时使用Fluent代码设计结构

Java11嵌套类同时使用Fluent代码设计结构
EN

Stack Overflow用户
提问于 2019-11-08 20:20:50
回答 2查看 60关注 0票数 1

因此,我继承了一个自动化项目(基于JAVA11,使用Selenium/TestNG),他们希望将它重新分解为代码库使用Fluent设计,这样,非编码人员就可以更容易地启动测试构建。使得Sense...however...they在其Page中使用嵌套的JAVA类,并且仍然希望保持这种状态。

我对C#很在行,但不太熟悉JAVA和嵌套类。下面是我所说的例子。他们基本上想要Fluent设计,所以如果他们需要访问嵌套类,他们可以在父类的using事件中调用它,这样它不会影响链。

我已经查找过Selenium的例子,但是很难找到一些。如能提供任何协助,我们将不胜感激。

代码语言:javascript
复制
\\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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-09 00:11:57

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

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

请注意,下面的代码编译并可以执行(通过"main“方法)--如果可能的话,这就是您的代码应该在您的问题中显示的方式。

代码语言:javascript
复制
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) {}
    }

}
票数 2
EN

Stack Overflow用户

发布于 2019-11-08 21:18:57

静态的公共内部类本质上是一个完全独立的类,可以轻松地放在另一个文件中。

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

如果方法AccountName_dropdwn返回一个AddEditUserInformation对象,我认为您的代码可能会正常工作。我假设方法名称的不必要的限定不会阻止它的工作,但它是如此的不寻常,我不确定。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58773286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档