1

我使用 Scala 2.10、Specs2 13.1-SNAPSHOT 和 Play2 Framework 2.1 提供的 FluentLenium Api。

我的IntegrationSpec文件中有这行代码,找到一个子元素(根据 FluentLenium 规范):

browser.find(".myClass").find("#mySubElement") must haveSize(1)

该行导致以下编译错误:

error: type mismatch;
found   : org.fluentlenium.core.domain.FluentList[_ <: org.fluentlenium.core.domain.FluentWebElement]
required: org.fluentlenium.core.domain.FluentList[?0(in value $anonfun)] where type ?0(in value $anonfun) <: org.fluentlenium.core.domain.FluentWebElement
Note: org.fluentlenium.core.domain.FluentWebElement >: ?0, but Java-defined class FluentList is invariant in type E.
You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10)

由于泛型,它是一种......不兼容的Scala / Java吗?还是我没有弄清楚的正常行为?

然而,这一行(省略任何匹配器)可以很好地编译:

browser.find(".myClass").find("#mySubElement")
4

1 回答 1

1

haveSize匹配器要求被匹配的元素在org.specs2.data.Sized范围内具有类型类。java集合对应的类型类是:

implicit def javaCollectionIsSized[T <: java.util.Collection[_]]: Sized[T] = 
  new Sized[T] {
    def size(t: T) = t.size()
  }

我怀疑这里的类型推断是问题所在,您可以尝试使用以下丑陋的代码来驯服它:

browser.find(".myClass").
        find("#mySubElement").
        asInstanceOf[FluentList[FluentWebElement]] must haveSize(1)

或许

browser.find(".myClass").
        find("#mySubElement").
        asInstanceOf[Collection[_]] must haveSize(1)

或者

import scala.collection.convert.JavaConverters._

browser.find(".myClass").
        find("#mySubElement").
        asScala must haveSize(1)
于 2013-02-20T01:04:18.013 回答