了解jqGrid是否已加载并准备好使用Selenium的最佳方法

了解jqGrid是否已加载并准备好使用Selenium的最佳方法,selenium,jqgrid,Selenium,Jqgrid,您如何通过selenium了解jqGrid是否已加载并准备好使用 一些细节: 我正在使用C#驱动程序 我有一个方法:newwebdriverwait(driver,newtimespan(0,0,0,30)).Until(x=>loadingdissaperedcondition)我用它来等待加载。。元素消失了 我有时也会使用以下脚本: private const string script=@“return($('.{0}').jqGrid('getGridParam','reccount

您如何通过selenium了解jqGrid是否已加载并准备好使用

一些细节:

  • 我正在使用C#驱动程序
  • 我有一个方法:
    newwebdriverwait(driver,newtimespan(0,0,0,30)).Until(x=>loadingdissaperedcondition)
    我用它来等待加载。。元素消失了
  • 我有时也会使用以下脚本:
private const string script=@“return($('.{0}').jqGrid('getGridParam','reccount')!=x未定义)&($('.{0}').jqGrid('getGridParam','reccount')!=0)&(!$('load{0}')。is(':visible')&('getGridParam','reccount busyIcon')。is(':visible'))”)

查找jqGrid是否有记录并已完成加载


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

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

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

if($(“#网格”)[0].grid){
//网格已初始化
}

以确定网格已初始化。jqGrid在内部使用相同的测试(参见示例)。

这里是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);
    }
}

不知道为什么@Oleg的回答对我不起作用。看起来网格甚至在ajax调用之前就已经被填充了。看起来新版本可能有一些变化。看起来ajax调用中最后发生的事情是“加载”块被隐藏,因此我找到了该元素并检查其显示属性a la:

def wait_for_jqgrid(self,t=20):
def检查网格(驱动程序):
#jqgrid在ajax调用之后做的最后一件事是关闭loading div
#因此,我们找到它并检查它的display属性是否不再设置为“none”
script='pid=$.jgrid.jqID($(.ui-jqgrid-btable”).get(0.p.id);return$(“#load"+pid).get(0).style.display==“无”;”
返回驱动程序。执行_脚本(脚本)
WebDriverWait(self.driver,t).直到(检查jqgrid)

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

网格初始化后,它将进行ajax调用以从服务器获取数据。稍后,每当ppl也刷新网格时,它都会调用以获取数据。我基本上想要一个脚本,当jqGrid加载时返回'true',当它空闲时返回'false'-如果我能得到这样一个脚本,我就可以在selenium中执行它。@Zasz:只有当
datatype:“json”
datatype:“xml”
时,才存在对服务器填充数据的请求。它取决于其他设置,如(
loadonce:true
)。根据用户的活动,可以从服务器重新填充网格。例如,如果用户按列排序,单击下一页等,新请求将发送到服务器,网格的内容将刷新。您可以使用
beforeRequest
beforeProcessing
loadComplete
loadError
回调来控制何时启动和何时结束对服务器的请求。是的,这些回调最接近我所需要的—但我无法控制何时执行它们。我将使用selenium进行轮询,以了解何时加载jqgrid(轮询=仅以500毫秒的间隔执行脚本)。虽然回调告诉我jqGrid的状态,但我需要在轮询时使用一个脚本来告诉我jqGrid的状态。谢谢你花时间帮我。@Zasz:不客气!您只需定义一个变量,如
var inload并在请求前将其设置为
中的
true
,然后在
loadComplete
loadError
的内部将其重置为
false
。您可以在作用域中定义变量(例如作为全局变量),您可以使用Selenium轻松访问该变量。。。
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);
    }
}