Java Selenium中的页面对象模型是否正确?

Java Selenium中的页面对象模型是否正确?,java,selenium,testing,automated-tests,prestashop,Java,Selenium,Testing,Automated Tests,Prestashop,我正试图通过SeleniumWebDriver自动化prestashop测试用例。我这样做是否正确,尤其是页面对象模型 这是我的HomePagePOM课程: package pageObjects; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.Alert; public

我正试图通过SeleniumWebDriver自动化prestashop测试用例。我这样做是否正确,尤其是页面对象模型

这是我的HomePagePOM课程:

package pageObjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.Alert;

public class HomePagePOM {
    private static WebElement element = null;
    private static WebDriver driver = null;
    public static String correctLogin = "aaaa";

    public static void enterPage(WebDriver driver) {
        driver.get("http://website.com");
    }

    public static WebElement homeLogo(WebDriver driver) {
        element = driver.findElement(By.id("header_logo"));
        return element;
    }

    public static WebElement searchBar(WebDriver driver) {
        element = driver.findElement(By.id("search_query_top"));
        return element;
    }

    public static WebElement searchBarButton(WebDriver driver) {
        element = driver.findElement(By.name("submit_search"));
        return element;
    }

    public static WebElement contactUs(WebDriver driver) {
        element = driver.findElement(By.id("contact-link"));
        return element;
    }

    public static WebElement signIn(WebDriver driver) {
        element = driver.findElement(By.className("header_user_info"));
        return element;
    }

}
package pageObjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class LoginPagePOM {
    private static WebElement element = null;
    private static WebDriver driver = null;
    public static String correctLogin = "client";
    public static String incorrectLogin = "client_incorrect";
    public static String correctPassword = "pass_correct";
    public static String incorrectPassword = "pass_incorrect";

    public static WebElement createAccountField(WebDriver driver) {
        element = driver.findElement(By.id("email_create"));
        return element;
    }
    public static WebElement registeredEmailField(WebDriver driver) {
        element = driver.findElement(By.id("email"));
        return element;
    }
    public static WebElement registeredPasswordField(WebDriver driver) {
        element = driver.findElement(By.id("passwd"));
        return element;
    }
    public static WebElement registeredSubmitButton(WebDriver driver) {
        element = driver.findElement(By.id("SubmitLogin"));
        return element;
    }
    public static WebElement createAccountButton(WebDriver driver) {
        element = driver.findElement(By.id("SubmitCreate"));
        return element;
    }
}
这是我的LoginPagePOM类:

package pageObjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.Alert;

public class HomePagePOM {
    private static WebElement element = null;
    private static WebDriver driver = null;
    public static String correctLogin = "aaaa";

    public static void enterPage(WebDriver driver) {
        driver.get("http://website.com");
    }

    public static WebElement homeLogo(WebDriver driver) {
        element = driver.findElement(By.id("header_logo"));
        return element;
    }

    public static WebElement searchBar(WebDriver driver) {
        element = driver.findElement(By.id("search_query_top"));
        return element;
    }

    public static WebElement searchBarButton(WebDriver driver) {
        element = driver.findElement(By.name("submit_search"));
        return element;
    }

    public static WebElement contactUs(WebDriver driver) {
        element = driver.findElement(By.id("contact-link"));
        return element;
    }

    public static WebElement signIn(WebDriver driver) {
        element = driver.findElement(By.className("header_user_info"));
        return element;
    }

}
package pageObjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class LoginPagePOM {
    private static WebElement element = null;
    private static WebDriver driver = null;
    public static String correctLogin = "client";
    public static String incorrectLogin = "client_incorrect";
    public static String correctPassword = "pass_correct";
    public static String incorrectPassword = "pass_incorrect";

    public static WebElement createAccountField(WebDriver driver) {
        element = driver.findElement(By.id("email_create"));
        return element;
    }
    public static WebElement registeredEmailField(WebDriver driver) {
        element = driver.findElement(By.id("email"));
        return element;
    }
    public static WebElement registeredPasswordField(WebDriver driver) {
        element = driver.findElement(By.id("passwd"));
        return element;
    }
    public static WebElement registeredSubmitButton(WebDriver driver) {
        element = driver.findElement(By.id("SubmitLogin"));
        return element;
    }
    public static WebElement createAccountButton(WebDriver driver) {
        element = driver.findElement(By.id("SubmitCreate"));
        return element;
    }
}
这是我的LoginPageCorrectLogin类,它执行一个测试用例-正确登录到prestashop网站:

package testCases;
import pageObjects.HomePagePOM;
import pageObjects.LoginPagePOM;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class LoginPageCorrectLogin {
    public static WebDriver driver = null;
    public static WebElement element = null;
    public static void main(String[] args) {
        driver = new FirefoxDriver();

        HomePagePOM.enterPage(driver); //Enter home site
        HomePagePOM.signIn(driver).click(); //Find Sign In option and click
        LoginPagePOM.registeredEmailField(driver).sendKeys(LoginPagePOM.correctLogin); // Input correct login to field
        LoginPagePOM.registeredPasswordField(driver).sendKeys(LoginPagePOM.correctPassword); //Input correct password to field
        LoginPagePOM.registeredSubmitButton(driver).click(); // Click on submit button
    }

}
我对Selenium很感兴趣,但我想使用最佳实践。对吗?对于本例,我将创建其他类,如LoginPageCorrectPassword、LoginPageIncorrectLogin和LoginPageIncorrectPassword。
关于页面模型对象的任何建议都将非常有用。

由于这是一个开放式问题,以下是一些一般性的建议:

您可能不需要多页来输入正确的密码, 不正确的密码等,因为这些很可能真的没有什么不同 页。 将URL和用户名/密码等字符串移动到 string table/resource file/config file/something。准备好了吗 在代码中,例如,如果出现以下情况,则意味着您必须编辑代码: 密码更改;还有许多其他的负面因素。 对页面对象执行常规操作。简单的例子: LoginPagePOM.loginusername、password、isValidLogin这样您就不会让登录代码到处重复,更容易理解,而且您只需在登录页面更改时更改1个位置
由于这是一个开放式问题,以下是一些一般性要点:

您可能不需要多页来输入正确的密码, 不正确的密码等,因为这些很可能真的没有什么不同 页。 将URL和用户名/密码等字符串移动到 string table/resource file/config file/something。准备好了吗 在代码中,例如,如果出现以下情况,则意味着您必须编辑代码: 密码更改;还有许多其他的负面因素。 对页面对象执行常规操作。简单的例子: LoginPagePOM.loginusername、password、isValidLogin这样您就不会让登录代码到处重复,更容易理解,而且您只需在登录页面更改时更改1个位置
在编写对象时,尽可能多地封装所有元素,这样方法就不会绑定到访问原始元素。它们应该更像是一种行动

下面是我在查看上面的代码后得出的结论

首先,我创建了一个browser对象来处理与浏览器相关的操作。特定于浏览器的操作包括最大化、调整大小、清除cookie等

public class Browser {

    public static Browser newBrowser(WebDriver driver) {
        return new Browser(driver);
    }

    private final WebDriver driver;
    private Browser(WebDriver driver) {
        this.driver = driver;
    }

    public HomePage gotoHomePage() {
        driver.get("http://website.com");
        return new HomePage(driver);
    }
}
这里有一个更简单的主页。你的方法应该描述一个动作。那样读起来更容易

public class HomePage {

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

    public LoginPage signIn() {
        driver.findElement(By.className("header_user_info")).click();
        return new LoginPage(driver);
    }
}
接下来是登录页面。若你们注意到了,我有两个版本的登录方法,成功和失败。也许只有我一个人,但当我做自动化的时候,我已经知道行动的结果,我所做的就是将其转化为自动化。因此,失败登录可能会转到其他页面,成功登录可能会转到其他页面。嗯,我们需要在这两种情况下处理它们,这样我们的物体就不会断裂。要记住的最重要的一点是,在测试用例中应该最小化条件if-else

public class LoginPage {
    public static String correctLogin = "client";
    public static String incorrectLogin = "client_incorrect";
    public static String correctPassword = "pass_correct";
    public static String incorrectPassword = "pass_incorrect";

    private final WebDriver driver;
    public LoginPage(WebDriver driver) {
        super();
        this.driver = driver;
    }

    public FailurePage registerAndFail(String email, String password) {
        driver.findElement(By.id("email")).sendKeys(email);
        driver.findElement(By.id("passwd")).sendKeys(password);
        driver.findElement(By.id("SubmitLogin")).submit();
        return new FailurePage(driver);
    }

    public SuccessPage registerAndSucceed(String email, String password) {
        driver.findElement(By.id("email")).sendKeys(email);
        driver.findElement(By.id("passwd")).sendKeys(password);
        driver.findElement(By.id("SubmitLogin")).submit();
        return new SuccessPage(driver);
    }
}
下面是您将如何编写测试

public class LoginPageCorrectLogin {

    public static void main(String[] args) {
        Browser browser = Browser.newBrowser(new FirefoxDriver());
        HomePage homepage = browser.gotoHomePage();
        // assertions here
        LoginPage loginPage = homepage.signIn();
        //assertions here
        SuccessPage sucessPage = loginPage.registerAndSucceed(LoginPage.correctLogin, LoginPage.correctPassword);
        // assertions here
    }

}

在编写对象时,尽可能多地封装所有元素,这样方法就不会绑定到访问原始元素。它们应该更像是一种行动

下面是我在查看上面的代码后得出的结论

首先,我创建了一个browser对象来处理与浏览器相关的操作。特定于浏览器的操作包括最大化、调整大小、清除cookie等

public class Browser {

    public static Browser newBrowser(WebDriver driver) {
        return new Browser(driver);
    }

    private final WebDriver driver;
    private Browser(WebDriver driver) {
        this.driver = driver;
    }

    public HomePage gotoHomePage() {
        driver.get("http://website.com");
        return new HomePage(driver);
    }
}
这里有一个更简单的主页。你的方法应该描述一个动作。那样读起来更容易

public class HomePage {

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

    public LoginPage signIn() {
        driver.findElement(By.className("header_user_info")).click();
        return new LoginPage(driver);
    }
}
接下来是登录页面。若你们注意到了,我有两个版本的登录方法,成功和失败。也许只有我一个人,但当我做自动化的时候,我已经知道行动的结果,我所做的就是将其转化为自动化。因此,失败登录可能会转到其他页面,成功登录可能会转到其他页面。嗯,我们需要在这两种情况下处理它们,这样我们的物体就不会断裂。要记住的最重要的一点是,在测试用例中应该最小化条件if-else

public class LoginPage {
    public static String correctLogin = "client";
    public static String incorrectLogin = "client_incorrect";
    public static String correctPassword = "pass_correct";
    public static String incorrectPassword = "pass_incorrect";

    private final WebDriver driver;
    public LoginPage(WebDriver driver) {
        super();
        this.driver = driver;
    }

    public FailurePage registerAndFail(String email, String password) {
        driver.findElement(By.id("email")).sendKeys(email);
        driver.findElement(By.id("passwd")).sendKeys(password);
        driver.findElement(By.id("SubmitLogin")).submit();
        return new FailurePage(driver);
    }

    public SuccessPage registerAndSucceed(String email, String password) {
        driver.findElement(By.id("email")).sendKeys(email);
        driver.findElement(By.id("passwd")).sendKeys(password);
        driver.findElement(By.id("SubmitLogin")).submit();
        return new SuccessPage(driver);
    }
}
下面是您将如何编写测试

public class LoginPageCorrectLogin {

    public static void main(String[] args) {
        Browser browser = Browser.newBrowser(new FirefoxDriver());
        HomePage homepage = browser.gotoHomePage();
        // assertions here
        LoginPage loginPage = homepage.signIn();
        //assertions here
        SuccessPage sucessPage = loginPage.registerAndSucceed(LoginPage.correctLogin, LoginPage.correctPassword);
        // assertions here
    }

}

Prestashop的自动化测试用例?祝你好运,先生。为Prestashop自动测试用例?祝你好运,先生。