似乎您正在尝试构建一个关键字驱动的框架。老实说,听到任何成功的故事,我都会感到非常惊讶。一直想知道这种框架的真正目的是什么?谁会用它?经理、人工 QA 还是利益相关者?对我来说,让非技术人员参与测试自动化活动是没有意义的。任何自动化都需要良好的技术技能(包括编程和 devops)。否则失败的概率很高。
无论如何,您的问题更多是关于 strings 与 functional interfaces 映射,或者非常聪明的反射使用。但主要问题是您为此选择了错误的 API [输入]。以下行:
driver.findElement(locator).doSmth();
是正确的失败方式,因为findElement 使用隐式等待。当你遇到NoSuchElementException / StaleElementReferenceException 时,我 100% 确信你会开始全局重构/修改实施的方法。
常识建议对ExpectedConditions 使用流畅的等待。但这会使您的任务更加复杂,因为除了定位器和操作之外,您还必须考虑条件,这些条件应该由用户提供。
从技术角度来看,我会首先创建通用包装器来封装低级 WebDriver API 调用。与原始调用相比,映射或反映此类函数会容易得多。例如。预期条件可以隐藏在枚举级别:
@Getter
@RequiredArgsConstructor
public enum WaitCondition {
visible(ExpectedConditions::visibilityOfElementLocated),
enabled(ExpectedConditions::elementToBeClickable);
private final Function<By, ExpectedCondition<WebElement>> type;
}
通过调用例如可以很容易地检索所需的常量。 WaitCondition.valueOf("visible"),输入字符串可以从外部传入。
通用 API 包装器可能如下所示:
protected void click(By locator) {
click(locator, enabled);
}
protected void click(By locator, WaitCondition condition) {
waitFor(locator, condition).click();
}
private WebElement waitFor(By locator, WaitCondition condition) {
return wait.until(condition.getType().apply(locator));
}
此线程中的其他人已经提供了映射/反射示例。请注意:如果您更喜欢反射,我建议您查看 jOOR 库,它可以简化此过程。