Selenium - 在继续之前等待Javascript函数执行

时间:2012-02-15 10:45:58

标签: java javascript function selenium wait

我目前正在使用Selenium创建一些测试用例,我遇到了一个问题。

在我的测试用例中,我试图浏览的网站有一个小表单和一个搜索按钮。填写表单并单击按钮没问题。一旦点击问题就会出现问题。

点击按钮后,会调用此函数:

function muestraEspera(){
document.getElementById("divCargando").style.display = "";
}

基本上,这使得DIV显示包含“加载”图像,因此访问者只看到图像并且无法实际看到网站加载内容直到完成(内容加载了ajax)。

加载内容后,执行此功能:

function escondeEspera(){
document.getElementById("divCargando").style.display = "none";
}

这基本上隐藏了“加载”DIV,因此访问者可以看到结果。

现在,我不能使用SLEEPS,因为加载可能需要更多或更少,因为我需要网站的实际执行时间。有没有办法(使用java-junit4)让selenium等到第二个函数执行后再继续下一步呢?

编辑:我确实使用Selenium RC。要启动驱动程序,我使用:

public void setUp() throws Exception {
        selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "website-url");
        selenium.start();
    }

最后,由Pavel Janicek给出的完美适合我的解决方案是:

boolean doTheLoop = true;
      int i = 0;
      while (doTheLoop){      
      i= i+200;
      Thread.sleep(1000);
      if (i>30000){
        doTheLoop = false;
      }
      if (!selenium.isVisible("id=divCargando")){
         doTheLoop = false;
      }      
      if (selenium.isVisible("id=divCargando")){
             doTheLoop = true;
          }      
     }

3 个答案:

答案 0 :(得分:4)

您可以使用waitForCondition
如果您使用的是WebDriver,可以尝试使用WebDriverBackedSelenium或FluentWait。 我认为this link会有所帮助。

答案 1 :(得分:3)

你应该试试这个。它一直等到指定的超时。它等待的内容在FluentWait对象中指定。它一直等到布尔值变为true。因此,如果您的元素不再可见,则布尔值为true,方法停止等待。关于这一点的好处是它只会每1秒询问一下你的元素是否可见,而不是尽可能快地询问它是没有意义的。

public static void wait(WebDriver driver, int timeout, final By locator){
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(timeout, TimeUnit.SECONDS)
       .pollingEvery(1, TimeUnit.SECONDS)
       .ignoring(NoSuchElementException.class)

    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            WebElement element = driver.findElement(locator);
            return !element.isDisplayed();
        }
    });
}
编辑:正如您在评论和编辑中所写的那样,您似乎使用了Selenium 1. WebDriver是Selenium 2的一部分。所以只需得到这样的包装驱动程序:

Selenium selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "website-url");
CommandExecutor executor = new SeleneseCommandExecutor(selenium); 
WebDriver driver = new RemoteWebDriver(executor, new DesiredCapabilities());

答案 2 :(得分:2)

**编辑3 **

所以我们有:

DefaultSelenium selenium = new DefaultSelenium("localhost",4444,"*iexplore", "websiteURL");

仍然可以像这样使用命令isVisible

boolean doTheLoop = true;
    int i = 0;
    while (doTheLoop){      
        i = i+200;
        Thread.sleep(200);
        if (i>30000){
            doTheLoop = false;
        }
        if (!selenium.isVisible("id=the ID Of element")){
            doTheLoop = false;
      }      
}

希望你不会陷入无限循环。

我从未使用过DefaultSelenium,因此请使用isVisible()函数,就像使用click()一样。