我是硒新手。我面临一个问题。单击按钮(通过ajax调用触发)后,页面中Web元素的数量增加。因此,在单击按钮后获得元素的大小时,会给出相同的值(但是它是在站点中手动更新的)。

我尝试了等待ajax,也隐式等待。在隐式等待时,它会引发未找到元素的异常。

如何等待直到Web元素的计数被更改。

#1 楼

感谢您的回复。但这是我用来解决此问题的脚本

public void waitUntilCountChanges() {
        WebDriverWait wait = new WebDriverWait(getDriver(), 5);
        wait.until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                int elementCount = driver.findElement(By.xpath("xxxx")).size();
                if (elementCount > 1)
                    return true;
                else
                    return false;
            }
        });
    }


#2 楼

要添加到gomesr的答案中,您可能会发现自己需要在测试期间等待其他元素。轻松拥有可重用代码的一种方法是使用闭包(也称为匿名函数或lambda函数)创建微调功能,您可以在等待元素加载时调用它。

微调器功能看起来像

public function spin ($lambda, $wait = 60) {
    for ($i = 0; $i < $wait; $i++) {
        try {
            if ($lambda($this)) {
                return true;
            }
        } catch (Exception $e) {
            // do nothing
        }

        sleep(1);
    }

    $backtrace = debug_backtrace();

    throw new Exception(
        "Timeout thrown by " . $backtrace[1]['class'] . "::" . $backtrace[1]['function'] . "()\n" .
        $backtrace[1]['file'] . ", line " . $backtrace[1]['line']
    );
}


并调用该函数

$this->spin(function($context) {
    return ($context->getSession()->getPage()->findById('example')->isVisible());
 });


调用Spinner函数时,您会传递一个匿名函数,并带有要声明的逻辑,在此示例中,它正在等待ID为“ example”的元素可见。微调器还包括一个超时,如果在指定时间内(默认为60秒)未找到该元素,则将引发异常。

上面的示例代码来自http://docs.behat.org/cookbook/using_spin_functions.html

您还可以找到有关自旋函数的更多信息和另一个代码示例在http://sauceio.com/index.php/2011/04/how-to-lose-races-and-win-at-selenium/

评论


感谢您的答复。但是在这种情况下,我似乎面临着一个综合问题。让我将其发布为其他问题。这样对用户可能会有帮助。

–阿吉玛尔
13-10-23在11:59

#3 楼

您将必须执行手动循环,以等待计数等于X。请设置超时,以免无限期等待。就像这样:

start_time=now  
count=number of elements  
while count < X:  
  count=number of elements  
  if now - start_time > timeout  
    exit loop