如何在使用 selenium 进行 UI 自动化的同时进行放心的并行调用

问题描述 投票:0回答:1

我有使用 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 调用完成。

我尝试使用多线程但没有得到很好的例子。

multithreading selenium-webdriver rest-assured
1个回答
0
投票

你可以使用 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());
© www.soinside.com 2019 - 2024. All rights reserved.