Java:调用名称存储在变量中的方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我有这样一个要求:

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中的Reflection,但根据我的需求,这看起来很复杂。任何指针都会有帮助!

提问于
用户回答回答于

最简单的方法是使用反射:

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);
用户回答回答于

你的变量代表你想用一个web元素做的事情(在这种情况下,点击它)。

适当的类型不是String。使用一个Consumer<WebElement>代替(或者driver.findElement()返回的是什么类型):

Consumer<WebElement> command = e -> e.click();

// ...

command.accept(driver.findElement(By.id("id1")));

这是类型安全的,高效的,可重构的,并且比反射灵活得多(因为你的消费者可以做任何想要的元素,而不限于没有任何参数的单个方法调用。例如,在文本中输入一些文本领域)

扫码关注云+社区