【问题标题】:Selenium: how to wait for RichFaces ajax requests to completeSelenium:如何等待 RichFaces ajax 请求完成
【发布时间】:2012-07-05 09:02:33
【问题描述】:

我使用 selenium 来测试 JSF/RichFaces 应用程序。由于“未找到元素”错误,测试随机失败。这如Selenium: intermittent “element not found” issues 中所述,但它仅与 jQuery ajax 调用有关。

这里的挑战是使用selenium.waitForCondition(jsExpression, timeout) 让 selenium 测试执行等待所有 ajax 请求完成。使用 RichFaces ajax 调用时最好的 jsExpression 是什么?

【问题讨论】:

    标签: ajax jsf selenium richfaces selenium-rc


    【解决方案1】:

    我调查了为 a4j:status 生成的 html。下面的代码现在可以完成这项工作,它比wait() 语句更好,但我正在寻找更好的解决方案。

    // depends on <a4j:status> present in the page under test
    selenium.waitForCondition(          
        "selenium.browserbot.getCurrentWindow().document.getElementById(
        "_viewRoot:status.start\").style.display == 'none'",
        "3000");
    

    【讨论】:

      【解决方案2】:

      我曾经发现自己的处境和你一样。此外,我有很多实际找到但不可见的元素——JSF 还不够快,无法让它们可见。另外,我厌倦了一次又一次地写selenium

      所以我坐下来写了下面的代码。它等待所有元素出现在页面上并且在与它们交互之前可见(或在超时后失败)。我后来搬到了 WebDriver,所以我没有原始代码,但它是这样的:

      public static long WAIT = 10000;    // ten seconds
      
      private void waitForElement(String locator) {
          long targetTime = System.currentTimeMillis() + WAIT;
          boolean found;
          do {
              found = selenium.isElementPresent(locator) && selenium.isVisible(locator);
          } while (!found && (targetTime < System.currentTimeMillis()));
          if (!found) {
              throw new SeleniumException("Element " + locator + " not found");
          }
      }
      
      public void click(String locator) {
          waitForElement(locator);
          selenium.click(locator);
      }
      
      public void type(String locator, String text) {
          waitForElement(locator);
          selenium.type(locator, text);
      }
      

      至于waitForCondition()应该是检测元素是否存在的代码:

      String locator = "id=anything";
      String script =
              "var retValue = true;" +
              "try {" +
              "    selenium.browserbot.findElement('" + locator + "');" +
              "} catch(e) {" +
              "    retValue = false;" +
              "}" +
              "retValue;";
      selenium.waitForCondition("!!selenium.browserbot.findElement('" + locator + "')", "10000");
      selenium.click(locator);
      

      还有纯 JavaScript:

      var retValue = true;
      try {
          selenium.browserbot.findElement('" + locator + "');
      } catch(e) {
          retValue = false;
      }
      retValue;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 2013-03-27
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        相关资源
        最近更新 更多