当网页使用基于 XMLHttpRequest 的 AJAX 调用时,如何在 selenium 中编写 wait_for_ajax 调用?

Abh*_*rma 1 ajax selenium xmlhttprequest

我有一个选择框,它调用基于 XMLHttpRequest 的 AJAX 调用来填充另一个选择框。我希望 Selenium 等到选择框被填充。我必须等待 XMLHttpRequest 的 readState 变量的值为 4,这意味着数据已填充。

Din*_*ent 5

在Java中:你可以像这样等待readyState变化:

    int tryCount = 0;
    boolean desiredResponseReceived = false;
    while (desiredResponseReceived == false && tryCount < 20) {
        String readyState = (String) js.executeScript("return xhr.readyState;");
        if (readyState.equals("4")) {
            desiredResponseReceived = true;
        }
        else {
            Thread.sleep(250);
            tryCount++;
        }
    }

    if (desiredResponseReceived == false) {
        driver.quit();
    }
Run Code Online (Sandbox Code Playgroud)

寻找就绪状态的一个问题是,页面可能发出多个 XMLHttpRequest。而且你不会知道哪一个是哪一个。即使您在单击相关按钮(例如)后立即检查它,也可能会触发多个请求。并且不知道哪个会先返回。

您的情况的另一个选择可能是等待框中的内容options发生select变化。所以在上面的代码中,你可以替换

String readyState = (String) js.executeScript("return xhr.readyState;");
     if (readyState.equals("4")) {
Run Code Online (Sandbox Code Playgroud)

List<WebElement> options = driver.findElements(By.tagName("option"));
     if (options.size() > 1) {
Run Code Online (Sandbox Code Playgroud)

或者,如果您不知道options期望的最小数量,您可以测试中是否option包含特定的。或类似的东西。attributeList