2017-05-15 145 views
0

我有一个java类,用于使用selenium执行登录操作。目前有10多种不同的登录类型,因此有很多其他的参与者看起来很糟糕并且效率不高。在运行时编译java代码

如:

if (logintype == 1) 
{ 
driver.findElement(By.id("username")).clear(); 
       driver.findElement(By.id("username")).sendKeys(username); 
       driver.findElement(By.id("password")).clear(); 
       driver.findElement(By.id("password")).sendKeys(password); 
       driver.findElement(By.id("signin")).click(); 
} 
else if (logintype ==2) 
{ 
driver.findElement(By.id("username")).clear(); 
       driver.findElement(By.id("username")).sendKeys(username); 
       driver.findElement(By.id("password")).clear(); 
       driver.findElement(By.id("password")).sendKeys(password); 
       driver.findElement(By.id("signin")).click(); 
} 
........... 
........... 

除了不是有效的代码需要编写,推新的代码和服务器需要每次添加一个新的登录模块的时间重新启动。

我想看看是否可以获得登录的逻辑可以存储在数据库中,如果它可以在运行时编译。我发现groovy shell,但我不知道如何将结果返回到我的类文件。另外运行groovy shell会需要很多代码更改。是否有可能在java

public class ExecuteAuth implements Runnable{ 

    private WebDriver driver; 

    driver = new FirefoxDriver(firefoxBinary, profile, cap); 
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 

    //MongoDB code 
    DBCursor dbObjects = loginCollection.find(); 

    while (dbObjects.hasNext()) { 
      DBObject dbObject = dbObjects.next(); 
      loginModule.add(new LoginModule((BasicDBObject) dbObject)); 

      String loginType = (String) dbObject.get("loginType") 
      String script; 
      if (loginType.equals("1")) { 
       script = (String) dbObject.get("script") 
      } 
    } 

    GroovyShell shell = new GroovyShell(); 

    shell.evaluate(script); 

    RUN REST OF THE LOGIN LOGIC AFTER THE CODE IS EVALUATED 
} 
+0

如果你走这条路,我想看看[盖布(http://gebish.org)特别是页面对象。 – chrylis

+0

只是为了澄清:你想重新编译一个你的java程序的现有类,并重新加载它,所有程序运行时? – Turing85

+0

为什么不让登录过程成为独立于应用程序其余部分的服务?然后它可以独立于主应用程序进行修改和重新部署 –

回答

2

我强烈建议不要这种方法。你正在打开一扇恶意代码的大门,将其注入你的应用程序中。另一种方式可以上传到服务器新的罐子,并采取类加载器的优势在运行时加载类:

此外,你必须替代方案,以避免如果其他的:接口使用和工厂方法是要走的路,imho。例如,将登录的实现放在实现登录界面的不同类上。

工厂方法设计模式: