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

时间:2013-05-21 13:33:55

标签: ajax selenium xmlhttprequest

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

1 个答案:

答案 0 :(得分:4)

在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();
    }

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

您的情况中的另一个选项可能是等待options框中的select更改。因此,在上面的代码中,您可以替换

String readyState = (String) js.executeScript("return xhr.readyState;");
     if (readyState.equals("4")) {

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

或者,如果您不知道期望的options的最小数量,您可以测试optionattribute的特定List。或类似的东西。