0

我正在尝试为一个用swing 用scala 编写的gui 应用程序编写自动化测试。我正在改编这篇文章中的代码,它利用getName()在树中找到正确的 ui 元素。

这是我的代码的独立版本。它不完整,未经测试,并且可能以各种方式损坏和/或非惯用和/或次优,但我的问题是关于下面列出的编译器错误。

import scala.swing._
import java.awt._
import ListView._

import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.FunSpec
import org.scalatest.matchers.ShouldMatchers

object MyGui extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "MyGui"

    val t = new Table(3, 3)
    t.peer.setName("my-table")
    contents = t
  }
}

object TestUtils {
  def getChildNamed(parent: UIElement, name: String): UIElement = {
    // Debug line
    println("Class: " + parent.peer.getClass() +
            " Name: " + parent.peer.getName())

    if (name == parent.peer.getName()) { return parent }

    if (parent.peer.isInstanceOf[java.awt.Container]) {

      val children = parent.peer.getComponents()
      /// COMPILER ERROR HERE   ^^^

      for (child <- children) {
        val matching_child = getChildNamed(child, name)
        if (matching_child != null) { return matching_child }
      }
    }

    return null
  }
}

@RunWith(classOf[JUnitRunner])
class MyGuiSpec extends FunSpec {
  describe("My gui window") {
    it("should have a table") {
      TestUtils.getChildNamed(MyGui.top, "my-table")
    }
  }
}

当我编译这个文件时,我得到:

29: error: value getComponents is not a member of java.awt.Component
      val children = parent.peer.getComponents()
                                 ^
one error found

据我所知,getComponents 实际上是 java.awt.Component 的成员。我使用这个答案中的代码来转储方法parent.peer,我可以看到 getComponents 在列表中。

欢迎提供另一种解决问题的方法(以类似方式进行自动 gui 测试)的答案,但我真的很想了解为什么我无法访问 getComponents。

4

1 回答 1

1

问题是您正在查看两个不同的课程。您的 javadoc 链接指向java.awt.Container,它确实有getComponents方法。另一方面,编译器正在寻找由返回getComponentsjava.awt.Component(父类),但parent.peer找不到。

而不是if (parent.peer.isInstanceOf[java.awt.Container]) ...,您可以验证 parent.peer 的类型并将其转换为:

parent.peer match {
      case container: java.awt.Container =>
         // the following works because container isA Container
         val children = container.getComponents
        // ...
      case _ => // ...
}
于 2013-04-11T05:27:01.153 回答