Skip to content

Instantly share code, notes, and snippets.

@PhilOwen
Created December 3, 2016 01:15
Show Gist options
  • Save PhilOwen/1642d4aca9a0746306b80db8373fc752 to your computer and use it in GitHub Desktop.
Save PhilOwen/1642d4aca9a0746306b80db8373fc752 to your computer and use it in GitHub Desktop.
SeleniumをScalaTestから

SeleniumとScalaTestで、ウェブサイトをブラウザからテストしてみる。
テスト対象は、Pyramidでアンケート的に連続してフォーム遷移 で作っておいたもの。 ログインして、いくつかのページでテキストを入力して終わり。

SBTで、SeleniumのJavaライブラリとScalaTestをインストールする。

mkdir -p src/test/scala
mv *.scala src/test/scala
sbt test

でテスト実行。

ScalaTestは、いろいろなテストの書き方をサポートするが、 今回はRubyのRSpec風に使えるFunSpecを使ってみた。
JUnit的な書き方をしたければ、FlatSpecがいいらしい。 FlatSpecは階層化できないが、 今回はテストをグループ化したかったので、FunSpecにした。

テストで何かをアサートで確認するにも、普通にassert()を使ったり、 shouldBe等を使ったり、やり方が多い。 今回は、文として読みやすい後者を使った。

なお、WebDriverのリソースは、 一つのテストごとに作成して開放している。 つまり、リソースがit()のテストごとに独立している。 beforeafterのブロックを参照。
やや手間が多いが、シンプルで、 並列実行にも向くので採用。

References

libraryDependencies ++= Seq(
"org.seleniumhq.selenium" % "selenium-java" % "3.0.1" % "test",
"org.scalatest" % "scalatest_2.10" % "3.0.1" % "test"
)
import org.openqa.selenium._
class LoginPage(implicit val driver: WebDriver) {
def load() {
driver.get("http://localhost:8080")
}
def setId(id: String) {
driver.findElement(By.name("id")).sendKeys(id)
}
def setName(name: String) {
driver.findElement(By.name("name")).sendKeys(name)
}
def login(): SlidePage = {
driver.findElement(By.cssSelector("[type=\"submit\"]")).click()
new SlidePage()
}
}
import org.scalatest._
import org.openqa.selenium._
import org.openqa.selenium.chrome._
class PageTestSpec extends FunSpec with Matchers with BeforeAndAfter {
var loginPage: LoginPage = null
var slidePage: SlidePage = null
before {
implicit val driver = new ChromeDriver()
loginPage = new LoginPage()
}
after {
loginPage.driver.quit()
}
describe("Slide page after login") {
it("should be at http://localhost:8080/slide/1") {
loginPage.load()
slidePage = loginPage.login()
slidePage.getCurrentUrl shouldBe "http://localhost:8080/slide/1"
}
it("should contain the user name in its title") {
loginPage.load()
loginPage.setId("12345")
loginPage.setName("owen")
slidePage = loginPage.login()
slidePage.getTitleText should include ("owen")
}
it("should allow the user to go to the next slide page") {
loginPage.load()
slidePage = loginPage.login()
slidePage.setText("selenium test")
slidePage.next()
succeed
}
}
describe("End page") {
it("should appear after 3 slides") {
loginPage.load()
slidePage = loginPage.login()
val slide2 = slidePage.next()
val slide3 = slide2.next()
val end = slide3.next()
end.driver.getPageSource should include ("end")
}
it("should be at http://localhost:8080/end") {
loginPage.load()
val end = loginPage.login().next().next().next()
end.getCurrentUrl shouldBe "http://localhost:8080/end"
}
}
}
import org.openqa.selenium._
class SlidePage(implicit val driver: WebDriver) {
def setText(text: String) {
driver.findElement(By.name("text1")).sendKeys(text)
}
def next(): SlidePage = {
driver.findElement(By.cssSelector("[type=\"submit\"]")).click()
new SlidePage()
}
def getTitleText(): String = {
driver.findElement(By.cssSelector("p")).getText
}
def getCurrentUrl: String = driver.getCurrentUrl
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment