我有一个java类,用于使用selenium执行登录操作。目前有10种以上不同的登录类型,因此有很多其他涉及的内容看起来很糟糕且效率不高。
例如:
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();
}
...........
...........
除了代码不高效之外,每次添加新的登录模块时,都需要编写,推送新代码并重新启动服务器。
我想知道我是否可以将登录逻辑存储在db中,如果可以在运行时编译。我发现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 :(得分:2)
我强烈反对这种做法。您正在为应用程序中注入错误代码打开一扇门。另一种方法是将新的jar上传到服务器并利用类加载器在运行时加载类:
此外,您还可以选择避免使用if-else:接口和工厂方法的使用是可行的方法,imho。例如,将登录的实现放在实现Login接口的不同类上。
工厂方法设计模式: