我有一个要求:
String command = "click"; // this can have value such as clear, getLocation, getSize, getTagName etc.
WebDriver driver = new ChromeDriver(options); //creating a webdriver object
driver.findElement(By.id("id1")).click(); //Here I want "click" method should be called dynamically as per what I have stored in variable `command`.
那么,有没有可能像这样:
driver.findElement(By.id("id1")).<something to call click()>
我已经看过Java中的反射,但根据我的需求,它看起来很复杂。任何指点都会很有帮助!
发布于 2017-08-30 19:40:08
最简单的方法是使用反射:
String command = "click";
WebElement element = driver.findElement(By.id("id1"));
Method method = WebElement.class.getMethod(command);
method.invoke(element);
如果您还想使用反射调用By.id
,那么您可以这样做:
String command = "click";
String id = "id";
Method byMethod = By.class.getMethod(id, String.class);
WebElement element = driver.findElement((By) byMethod.invoke(null, "id1"));
Method method = WebElement.class.getMethod(command);
method.invoke(element);
发布于 2017-08-30 19:39:34
您的变量表示您想要对web元素执行的操作(在本例中,单击它)。
合适的类型不是String
。改为使用Consumer<WebElement>
(或driver.findElement()
返回的任何类型):
Consumer<WebElement> command = e -> e.click();
// ...
command.accept(driver.findElement(By.id("id1")));
这是类型安全的、高效的、可重构的,而且比反射灵活得多(因为您的使用者可以对元素做任何它想做的事情,而不限于没有任何参数的单个方法调用。例如,在文本字段中输入一些文本)
发布于 2017-08-30 19:42:12
在设计方面(也许可以肯定地进一步优化和抽象),您可以定义一个Enum
,让我们将其命名为Action
:
public enum Action {
CLICK,
SENDKEY,
etc
}
然后在你的代码中这样做:
Action action = <input>;
// find the element
WebElement element = driver.findElement(By.id("id1"));
switch(action) {
case CLICK:
element.click();
break;
case SENDKEY:
element.sendKey();
break;
...
default:
System.out.println("Undefined action");
break;
}
https://stackoverflow.com/questions/45959319
复制相似问题