当前位置: 首页 > 知识库问答 >
问题:

硒 Web 驱动程序,等待异步回发更新面板请求完成

江飞白
2023-03-14

我有一个带有可单击列标题的表。第一次单击时,列应按升序排序,第二次单击时,列应按降序排序。排序已使用异步回发更新面板实现(我不知道它是如何完成的,它是一个aspx页面)。我想使用Selenium Webdrive自动执行排序功能。我如何为页面实现WAIT条件,其中页面不会被重新加载,但只会重新加载表内容。waitForElementPresent不起作用,因为单击标题时不会显示或隐藏新元素。PS:需要Java实现。

共有2个答案

赵晨
2023-03-14

您应该等到 JQuery.active 重新调谐 0。我的是用c#写的。除此之外,我们还可以等待您知道将满足您的等待条件的特定元素。您可以使用 fluentWait 或编写自定义等待以等待元素存在。

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

编辑:爪哇版本

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;
}

直接从这里拿走

周祺
2023-03-14

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

>

  • 首先,它将导航到该网站。
  • 由于我正在考虑第二列“位置”,因此它将检索该列下的第一个文本。
  • 然后,单击列标题“位置”以升序排序
  • 等待,10 秒(最大),直到第一个文本更改。
  • 相应地打印结果。
  • 再次,单击列标题“位置”以降序排序
  • 等待,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方法获得相关结果。

  •  类似资料:
    • 我在eclipse中使用SeleniumWebDriver和TestNG。问题是页面在某些数据的中途重新登录,并且重新加载的时间是灵活的,这就是为什么我不能应用显式等待时间。我想让webdriver等待,直到重新加载完成。 我正在尝试通过此代码执行此操作……但它不起作用。

    • 问题内容: 我有一个使用mongodb本机驱动程序的node.js应用程序。在使用节点v8.9.1将应用程序代码迁移到异步/等待的过程中,我努力寻找一种适合mongodb查询的好方法。mongodb驱动程序的主要问题是,所有查询都使用回调,其中对异步方法来说,promise函数是必需的。 备择方案: 猫鼬 -承诺不赞成使用查询,它会强制使用Schema模型,这对我的应用程序来说有点开销。 mong

    • 正在研究尝试理解显式等待的方法。 所以单选按钮被点击后,输入形式发生了变化,所以我把给它一个时间元素出现,否则会出错“元素不可见......”。所以我认为现在是理解显式等待的好时机,因为我需要等到元素出现。 但出现错误“Selenium::WebDriver::error::ElementNotVisibleError:Element当前不可见,因此可能无法与之交互”。为什么这段代码不等到元素出现

    • 我正在编写一个与我们的一个系统交互的硒脚本。在我们的系统中,有一个按钮,当按下时,它只能正确加载页面大约一半的时间(它只是在每隔一个场合加载无限长的时间),因此我不能依赖默认的硒等待页面加载。因此,我想按下按钮,并在打开新窗口之前立即关闭Web浏览器以继续执行脚本。不幸的是,我无法解决按钮本身的问题。 我目前的代码: 目前,System.out不太可能达到,因为一旦action.perform()

    • 下面是我为firefox浏览器初始化的selenium web驱动程序。 尽管我给出了隐式等待,但我没有等待元素。它会立即抛出not found异常。如果我放那么它工作正常,没有任何问题。但是把现在测试用例包含更多线程的任何地方。sleep比实际的测试用例代码低。有人能给我建议正确的方法吗?

    • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?