有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,selenium在接口中没有构造函数

所以,我想知道我如何才能避开这个事实,我不能在接口中有一个构造函数

我正在使用JUnit和Selenium进行测试自动化。我有一个基本测试类,它有一个名为getDriver(LoginPage loginPage)的方法。此方法用于初始化web驱动程序。LoginPage是一个具有登录方法的接口。问题是我的所有页面对象构造函数都使用web驱动程序。getDriver方法初始化web驱动程序。因此,我的问题是,如何在这个方法中仅使用接口初始化page对象?谢谢

public interface LoginPage {

    public BasePage signIn(String user, String password); 

}

    //can't init LoginPage outside, since I need this method to init WebDriver
    public static WebDriver getDriver(LoginPage loginPage)
    {
    if (WebDriverUtil.hasQuit()) {
        log.debug("Creating new instance of driver");
        BaseTest.init();

        browser = region.getBrowser().getName();

        driver = WebDriverUtil.initDriver(browser, baseURL);
        wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
        SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
        if(loginPage != null)
        {
            loginPage.signIn(user, pass);
        }
    }       
    return driver;
 }

共 (2) 个答案

  1. # 1 楼答案

    我最终用反射来解决这个问题

    public static <T extends LoginPage> WebDriver getDriver(Class<T> loginClass)
    {
        if (WebDriverUtil.hasQuit()) {
            log.debug("Creating new instance of driver");
            BaseTest.init();
    
            browser = region.getBrowser().getName();
    
            driver = WebDriverUtil.initDriver(browser, baseURL);
            wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
            SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
    
            handleLogin(driver, loginClass);
        }       
    
        return driver;
    }
    
    private static <T extends LoginPage> void handleLogin(WebDriver driver, Class<T> loginClass)
    {
        if(loginClass != null)
        {
            try {
                Constructor<T> constructor = loginClass.getDeclaredConstructor(WebDriver.class);
                try {
                    T loginObj = constructor.newInstance(driver);
                    loginObj.signIn(user, pass);
                } catch (InstantiationException | IllegalAccessException
                        | IllegalArgumentException
                        | InvocationTargetException e) {
                    log.warn("Error instantiating object for class: " + loginClass.toString());
                }
            } catch (NoSuchMethodException e) {
                log.warn("No constructor that takes WebDriver is present on class: " + loginClass.toString());
                log.trace(e);
            } catch (SecurityException e) {
                log.warn("SecurityException present on class: " + loginClass.toString());
                log.trace(e);
            }
        }
    }
    
  2. # 2 楼答案

    您可以当场创建一个匿名类,或者在另一个类中实现接口并实例化它

    尽管使用Java代码输入密码似乎不是一个好主意,尤其是当它是以String的形式时