我有使用 selenium webdriver 运行的 UI 自动化脚本。在 selenium 脚本运行时,我还想拨打可能需要超过 2 分钟才能提供响应的放心呼叫。我不想在那段时间暂停 UI 自动化。实现这一目标的最佳方法是什么?
示例代码:
WebDriver driver;
driver.get("somewebsite");
driver.findElements().....
//API call
Response response = RestAssured.given()
.accept("application/json")
.body(validateDB.toString())
.when()
.log()
.all()
.post("query.json");
//UI automation
driver.findElements()...
我不想等待 api 调用完成。
我尝试使用多线程但没有得到很好的例子。
你可以使用 CompletableFuture 它提供了各种方法,如 supplyAsync、runAsync 和 thenApplyAsync 用于异步编程。下面我添加了一个带有示例 api 的示例,您可以在其中测试延迟
我们正在使用
CompletableFuture.supplyAsync()
方法使用 RestAssured 执行异步 API 调用。 API 调用请求来自 https://hub.dummyapis.com/delay?seconds=20
URL 的响应,延迟 20 秒,并返回一个 Response 对象。这个调用在一个单独的线程上执行,不会阻塞主线程,允许 UI 自动化脚本继续。
当您准备好从 api 访问响应时,下面的命令使用 apiCallFuture.get() 方法等待 API 调用完成。这将阻塞主线程,直到 API 调用完成并返回响应。
apiCallFuture.get()
完整代码
WebDriver driver = new ChromeDriver();
driver.get("https://havenweb.org");
driver.findElement(By.tagName("body")).getText();
System.out.println("UI Started");
CompletableFuture<Response> apiCallFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("Started API Code");
Response response = RestAssured.given().accept("application/json").when()
.get("https://hub.dummyapis.com/delay?seconds=20");
System.out.println("done with api");
return response;
});
driver.findElement(By.tagName("body")).getText();
System.out.println("Done with UI");
driver.quit();
//below will Wait for api response if it is not yet done ,otherwise will return response immediately
System.out.println(apiCallFuture.get().body().prettyPrint());