【问题标题】:How to pass one object to another如何将一个对象传递给另一个对象
【发布时间】:2022-01-14 22:06:06
【问题描述】:

在我的测试类 (Test.java) 中,我创建了对象变量:loginPage 和 homePage。 在 HomePage 类中,我创建了 Field 对象:emailField,其值为:“something” 如何在 HomePage 类中获取“emailField”值(以及整个对象)?

当我尝试在 getEmailValue() 方法中使用 emailField.getValue() 或 loginPage.emailField 时出现错误:无法解析符号 'emailField'/无法解析符号 'loginPage'

Test.java:

public class Test extends GeneralTest {
    @Test
    public void test() {
        LoginPage loginPage = new LoginPage(driver);
        HomePage homePage = loginPage.logIn(loginPage);
        homePage.getEmailValue();
    }
}

HomePage.java:

public class LoginPage{
    private Field logInField = new Field(FieldType.INPUT, By.id("test1"));
    public Field emailField = new Field(FieldType.INPUT, By.id("test2"));
    private WebDriver driver;

    public LoginPage(WebDriver driver){
        this.driver = driver;
        emailField.setValue("something");
        getSite("https://apply.commonapp.org/login");
    }

    public HomePage logIn(Object object){
        //some actions
        driver.findElement(logInField.getSelector()).click();
        return new HomePage(driver);
    }
}

HomePage.class:

public class HomePage{
    private WebDriver driver;

    public HomePage(WebDriver driver){
        this.driver = driver;
    }

    public void getEmailValue(){
        // emailField.getValue() -> Cannot resolve symbol 'emailField'
        // loginPage.emailField -> Cannot resolve symbol 'loginPage'
    }
}a

【问题讨论】:

  • 你可能想找一个关于 Java 的基础教程,并弄清楚继承。
  • 您可以为此使用依赖注入,但此时我会重新考虑使用 Page-Object-Model ... 并放弃 @test 注释、“字段”和扩展类. (这些通常与某种框架一起使用) Selenium 是基于时间线的一系列操作,这意味着您可以使用更直接、类似脚本的方法。如果您发现需要重用某些组件,您可以开发类对象、基类和依赖注入,构建适合您需求的架构。

标签: java selenium


【解决方案1】:
如何将一个对象传递给另一个对象

emailFieldLoginPage类变量,你可以通过LoginPage对象实例访问它。

将对象传递给某些类的基本方法是在构造函数中设置它们。 你已经为司机做了同样的事情。

public class HomePage{
    private WebDriver driver;
    private LoginPage loginPage;

    public HomePage(WebDriver driver, LoginPage loginPage){
        this.driver = driver;
        this.loginPage = loginPage;
    }

    // not sure what this method should do, but if it called get.. by naming conventions it should return something, so I changed it's type to Field and added return. But it's up to you, you may leave void, this is not related to your question.
    public Field getEmailValue(){
         return loginPage.emailField; // now this will work
    }
}

实例化时不要忘记传递 LoginPage 对象实例 主页。

public class LoginPage{
    private Field logInField = new Field(FieldType.INPUT, By.id("test1"));
    public Field emailField = new Field(FieldType.INPUT, By.id("test2"));
    private WebDriver driver;

    public LoginPage(WebDriver driver){
        this.driver = driver;
        emailField.setValue("something");
        getSite("https://apply.commonapp.org/login");
    }

    public HomePage logIn(Object object){
        //some actions
        driver.findElement(logInField.getSelector()).click();
        return new HomePage(driver, this); // this means current class instance
    }
}

一些教程

https://www.w3schools.com/java/java_constructors.asp http://tutorials.jenkov.com/java/constructors.html

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 2021-09-23
    • 2012-09-15
    • 2019-05-02
    • 2022-12-04
    • 1970-01-01
    • 2023-03-24
    • 2017-06-03
    相关资源
    最近更新 更多