Selenium Webdriver等待异步回发updatepanel请求完成

时间:2014-11-23 05:19:55

标签: java jquery selenium selenium-webdriver

我有一个包含可点击列标题的表格。首次单击时,列应按升序排序,第二次单击列应按降序排序。 使用异步回发更新面板实现了排序(我不确定它是如何完成的,它是一个aspx页面)。 我想使用Selenium Webdriver自动化排序功能。如何为不重新加载页面的页面实现WAIT条件,但只重新加载表格内容。 waitForElementPresent 不起作用,因为没有显示新元素或单击标题时隐藏。 PS:需要Java实现。

2 个答案:

答案 0 :(得分:1)

我添加了一个与 jquery表相关的示例程序。以下是代码的执行流程:

  • 首先,它将导航到该网站。
  • 因为我正在进行第二列"位置"考虑到它,它将检索该列下的第一个文本。
  • 然后,点击列标题"位置"按升序排序
  • 等待,10秒(最长),直到第一个文字发生变化。
  • 相应地打印结果。
  • 再次点击列标题" Position"按降序排序
  • 等待,10秒(最长),直到第一个文字发生变化。
  • 相应地打印结果。

    public class TestSortTable{
    
      static WebDriver driver;  
    
      public static void main(String[] args){
    
        driver = new FirefoxDriver();
    
        driver.manage().window().maximize();
    
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    
        driver.get("http://www.datatables.net/examples/basic_init/table_sorting.html");
    
         //For Ascending in column "Position"
         String result = clickAndWaitForChangeText(By.xpath("//table[@id='example']//th[2]"), By.xpath("//table[@id='example']//tr[1]/td[2]"), "Ascending");
    
         if(result.contains("Fail"))
             System.err.println(result);
         else
             System.out.println(result);
    
         //For Descending in column "Position"
         result = clickAndWaitForChangeText(By.xpath("//table[@id='example']//th[2]"), By.xpath("//table[@id='example']//tr[1]/td[2]"),"Descending");
    
         if(result.contains("Fail"))
             System.err.println(result);
         else
             System.out.println(result);
    
        driver.close();//closing browser instance
    
    }
    
    //For clicking on header and waiting till the first text in the column changes
    public static String clickAndWaitForChangeText(By Header_locator, By first_text_locator, String sortorder){
    
        try{
    
            String FirstText = driver.findElement(first_text_locator).getText();
    
            System.out.println("Clicking on the header for sorting in: "+sortorder); //sortorder -> String representing sort order Ascending/Descending
    
            driver.findElement(Header_locator).click();//Click for ascending/Descending
    
            //Below code will wait till the First Text changes for ascending/descending
            boolean b = new WebDriverWait(driver,10).until(ExpectedConditions.invisibilityOfElementWithText(first_text_locator, FirstText));
    
            if(b==true){
                return "Pass: Waiting Ends. Text has changed from '"+FirstText+"' to '"+driver.findElement(first_text_locator).getText()+"'";
            }
            else{
                return "Fail: Waiting Ends. Text hasn't changed from '"+FirstText+"'.";
            } 
    
        }catch(Throwable e){        
            return "Fail: Error while clicking and waiting for the text to change: "+e.getMessage();
        }
    
    }
    

    }

注意:您可以在代码中相应地使用 clickAndWaitForChangeText 方法获取相关结果。

答案 1 :(得分:0)

你应该等到JQuery.active返回0.我的是用c#编写的。除此之外,我们还可以等待您知道满足等待标准的特定元素。您可以使用fluentWait或编写custom wait等待元素存在。

 public void WaitForAjax()
    {
          var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
          wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
    }

编辑: Java版

public void waitForAjaxLoad(WebDriver driver) throws InterruptedException{
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    if((Boolean) executor.executeScript("return window.jQuery != undefined")){
        while(!(Boolean) executor.executeScript("return jQuery.active == 0")){
            Thread.sleep(1000);
        }
    }
    return;
}

直接取自here