好像你正在试图建立一个关键字驱动的框架。说实话,听到这个成功的故事,我会感到非常惊讶。总是想知道这种框架的真正目的是什么?谁会用它?经理,手动QA或利益相关者?对我来说,让非技术人员参与测试自动化活动是没有意义的。任何自动化都需要良好的技术技能(包括编程和devops)。否则,失败概率相当高。
无论如何,你的问题是更多关于strings
vs functional interfaces
映射,或非常聪明的反射用法。但主要问题是你选择了错误的API [输入]。下面一行:
driver.findElement(locator).doSmth();
是失败的一个正确的方式,为findElement
使用隐式等待。我敢肯定,当您面对NoSuchElementException
/StaleElementReferenceException
时,您将开始全球重构/修订实施方法。
常识建议使用流利的等待与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库,这可以简化此过程。
我很抱歉,因为我在同一个问题中提出另一个问题。 如果我的'id'也存储在一个变量中怎么办?例如,一个包含'id'或'xpath'的变量我必须采取行动: 'driver.findElement(By。<来自变量值>(“id1”))。' 在这种情况下,您的解决方案如何扩展? –
@OmSao我已经改变了一些代码,并为你添加了第二个问题的答案。请告诉我这段代码是否有效,因为我没有测试过它。 –