4

您如何通过 selenium 确定 jqGrid 是否已加载并准备好使用。

一些细节:

  • 我正在使用 C# 驱动程序
  • 我有一个方法:new WebDriverWait(driver, new TimeSpan(0, 0, 0, 30)).Until(x => loadingdissapearedcondition)我用它来等到 Loading.. 元素消失。
  • 我有时也使用这个脚本:

private const string script = @"return ($('#{0}').jqGrid('getGridParam', 'reccount') !=x undefined) && ($('#{0}').jqGrid('getGridParam', 'reccount') != 0) && (!$('#load_{0}').is(':visible')) && (!$('#busyIcon').is(':visible'))";

private readonly string waitScript;

waitScript = string.Format(script, jqGridId);

public void WaitUntilLoadIconDissappears()
{
    driver.WaitUntil(MAXWAIT, Wait);
}

public bool Wait()
{
    var executeScript = ((IJavaScriptExecutor) driver).ExecuteScript(waitScript);
    bool result;
    bool tryParse = bool.TryParse(executeScript.SafeToString(), out result);
    return tryParse && result;
}

查找 jqGrid 是否已完成记录和加载。

我需要更好的东西——如果我们使用 jqGrid 的本地数据,即使上述两个也不会让驱动程序等到加载完成。我也很好奇什么是最好的方法,或者至少是其他人如何处理这个问题。

4

3 回答 3

13

我以前从未使用过 Selenium,所以我不确定我是否正确理解了您的问题。jqGrid 将首先被初始化,然后(可选地)可以从服务器加载数据。在初始化阶段,原始<table id="grid"></table>元素将被转换为相对复杂的 HTML 片段,即网格。在初始化结束时,表格的 DOM 元素($("#grid")[0])将获得 expando grid

所以你可以像这样使用测试

if ($("#grid")[0].grid) {
    // grid is initialized
}

确定网格已经初始化。jqGrid 在内部使用相同的测试(例如,请参见此处)。

于 2012-08-01T11:22:11.053 回答
0

这是Java和jqgrid的解决方案。如果尚未加载网格数据,则右寻呼机没有价值,因此只需检查其长度。isElementPresent、isDisplayed 等方法似乎不适用于网格右分页器对象。ajax 时它始终存在于页面代码中,但在加载动态数据时会设置文本值。

public void waitForGridPagerRight(String gridName) throws Exception {

    for (int second = 0;; second++) {
        if (second >= 15) {
            fail("Timeout.");
        }
        try {
            if (driver
                    .findElement(By.id("pager_" + gridName + "_right"))
                    .getText().length() > 2)
                break;
        } catch (Exception e) {
        }
        Thread.sleep(1000);
    }
}
于 2014-04-09T10:08:48.527 回答
0

不知道为什么@Oleg 的回答对我不起作用。似乎在进行 ajax 调用之前就已经填充了网格。看来新版本可能会有一些变化。看起来在 ajax 调用中发生的最后一件事是“加载”块被隐藏了,所以我找到了那个元素并检查了它的显示属性:

  def wait_for_jqgrid(self, t=20):
    def check_jqgrid(driver):
      #the last thing jqgrid does after the ajax call is to turn off the loading div
      #so we find it and check to see if its display attribute is no longer set to 'none'
      script = 'pid = $.jgrid.jqID($(".ui-jqgrid-btable").get(0).p.id); return $("#load_"+pid).get(0).style.display == "none";'
      return driver.execute_script(script)
    WebDriverWait(self.driver, t).until(check_jqgrid)

当加载 div 被隐藏时,我们就完成了。这是 python 但相同的 javascript 位应该在 Java 或其他任何东西中工作。

于 2020-03-13T21:40:35.733 回答