【问题标题】:Error using Specs2 with FluentLenium Api将 Specs2 与 FluentLenium Api 一起使用时出错
【发布时间】:2013-02-04 21:22:23
【问题描述】:

我使用 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")

【问题讨论】:

    标签: scala webdriver playframework-2.0 specs2


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 谢谢 Eric :) 问题已解决!事实上,scala 编译器的推理并不明显。
    • 你最终选择了哪种解决方案?
    • 我选择了第一个(口味问题?:))因为这三个都很漂亮。我想我理解了这个问题:当链接 find 方法时,第二个返回一个没有任何参数类型的 FluentList!尽管如此,它的类定义是: public class FluentList ,所以正如您所提到的,javaCollectionIsSized 期望一个不变的 TYPED 集合,而不是原始集合(甚至包含方差),因此编译器会抱怨。你怎么看?
    • 这看起来与我在使用 Mockito 时遇到的一些问题非常相似。
    • 其实任何类型的MustMatcher都会出现这个错误。我不知道原因,但我很确定这个问题与构建 MustExpectable 的隐式方法有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多