java - 使用静态的 Selenium 框架

标签 java selenium

我正在编写一个 Selenium 框架,对于 Java 知识相对较少的测试人员来说,它应该非常容易使用和编写测试。为了使框架尽可能对用户友好,我注意到我编写了很多静态内容,以便测试人员不必每次都实例化页面对象和方法。这当然违背了OOP的原则。在我深入研究这个问题之前,我想看看我的方法是否有可行的替代方案。我在下面包含了实例化 Webdriver Singleton 的登录页面类,该类具有用户名/密码字段和登录按钮。此页面有 2 个使用 TestNG 运行的测试。所有要遵循的代码:

LoginPage.java

public class LoginPage {

    public static WebDriver driver;
    private static String username_selector = "username";
    private static String password_selector = "password";
    private static String login_button_selector = "#loginbutton > input";
    private static String fail_message_selector = "error";


    public static void goTo(String environment_url){
        driver = Driver.getDriver();
        driver.get(environment_url);
    }

    public static void loginAs(String username, String password){
        WebElement user = driver.findElement(By.name(username_selector));
        user.clear();
        user.sendKeys(username);
        WebElement pass = driver.findElement(By.name(password_selector));
        pass.clear();
        pass.sendKeys(password);
        WebElement loginBtn = driver.findElement(By.cssSelector(login_button_selector));
        loginBtn.click();
    }

    public static boolean loginErrorDisplayed(){
        WebElement failMessageContainer = driver.findElement(By.className(fail_message_selector));
            if(failMessageContainer.isDisplayed()){
                return true;
            }
            else return false;
    }

    public static String getLoginErrorMessage(){
        WebElement failMessageContainer = driver.findElement(By.className(fail_message_selector));
        String failMessage = failMessageContainer.getText();
        return failMessage;
    }

}

驱动程序.java

public class Driver {
    public static WebDriver driver = null;

    public static WebDriver getDriver(){
        if(driver == null){
            driver = new FirefoxDriver();
        }

        return driver; 
    }

    public static void killDriver(){
        driver.quit();
    }
}

LoginTest.java

public class LoginTest {

@Test(priority = 0)
public void loginfail() {
    LoginPage.goTo("http://127.0.0.1:8080/login");
    LoginPage.loginAs("wrong username", "wrongpassword");
    boolean didLoginFail = LoginPage.loginErrorDisplayed();
    Assert.assertTrue(didLoginFail == true, "Bad login was successful");
    if (didLoginFail){
        LoginPage.getLoginErrorMessage();
    }
}

@Test(priority = 1)
public void loginsuccess() {
    LoginPage.loginAs("correct_username", "correctpass");
    boolean didLoginFail = LoginPage.loginErrorDisplayed();
    Assert.assertTrue(didLoginFail == false, "Valid Login was unsuccessful");
}

}

最佳答案

这不是您问题的答案,但这将帮助您创建完美的 selenium 框架。

我建议您创建一个具有常见 API(例如 goTo() API)的 AbstractTestPage.java。您的所有页面(例如 LoginPage.java)都应该扩展 AbstractTestPage.java 以实现代码可重用性。

例如:

public abstract class AbstractTestPage {

    public static WebDriver driver;

    public static void goTo(String environment_url){
        driver = Driver.getDriver();
        driver.get(environment_url);
    }

}

public class LoginPage extends AbstractTestPage {

    .
    .
    .
    .
    .
    .
}

关于java - 使用静态的 Selenium 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422799/

相关文章:

c# - Selenium - 强制点击不可见元素

java - 如何使用 junit 在不关闭浏览器的情况下运行所有​​ selenium 测试

java - 将项目导入另一台计算机时出现编码错误

java - 使用try-with-resource在java中逐行读取文本文件

java - Camel 文件单元测试

java - 如何使用 Selenium for Java 自动设置 'https://stage.masterpassteststore.com/configuration'?

javascript - 如何在 MAC 上使用 Protractor 与 Appium 和 IOS-Simulator 进行自动化测试

python - 消息 : element not interactable Error While Sending Keys [search_bar. send_keys(course_name)] 使用 selenium python 搜索 Youtube Bar

selenium - 如何编写 Selenium Xpath

java - Sonarqube sonar.analysis.mode 预览模式被忽略