20
Web UI testing in Scala [email protected] @radimpavlicek

Web ui testing

Embed Size (px)

Citation preview

Why should I care?● regression errors● cross web browser (Firefox/IE/Chrome)● cross OS (Mac/Linux/Windows)● cross versions (browsers)● use cases documentation

Selenium● open-source● Domain Specific Language support in

ScalaTest 2.0

What’s needed?● continuous integration (Jenkins)● server with browser installation● test-cases from domain users

Recorder

Recorder cont.+ quickly record+ no knowledge required- fragile test cases- spaghetti test-case

Example

Scenario

Java applicationJSF

Continuous integrationJenkins

Scala codeSelenium

Invoked on Jenkins?● @Midnight● Maven

clean integration-test -P ui-test

Maven settings.xml<profile>

<id>ui-test</id><properties>

<onlineUsers.login>rpavlicek</onlineUsers.login><onlineUsers.password>*******</onlineUsers.password><onlineUsers.url>localhost</onlineUsers.url><onlineUsers.port>9090</onlineUsers.port>

</properties></profile>

Scala part

Input parametersobject Settings {

val url = System.getProperty("onlineUsers.url" )

val login = System.getProperty("onlineUsers.login" )

val password = System.getProperty("onlineUsers.password" )

val port = {

val tmp = System.getProperty("onlineUsers.port" )

if (null == tmp)

new Integer(9090)

else new Integer(tmp)

}

}

WebDriverobject WebDriverAccess {

val defaultDriver : WebDriver = {

print("Creating WebDriver... " )

try {

new FirefoxDriver()

} finally { println("Done.") }

}

}

WebDriver cont.trait WebDriverAccess {

implicit val driver = WebDriverAccess.defaultDriver

}

implicit = if a parameter value is not supplied

then the compiler will search for an "implicit"

value defined within scope

Page objects pattern● model UI as services● not exposing internals● model just what is tested● public service methods return PageObjects

PageObject implementationabstract class Page[T <: Page[T]]( expectedId: String, val driver:

WebDriver) {

self: T =>

waitUntil { !driver.findElements(By.id(expectedId)).isEmpty }

private val tmpId: By = By.id(expectedId)

try { driver.findElement(tmpId)

} catch {

case nsee: NoSuchElementException =>

Assert.fail("ID not found:"+expectedId)

}

}

PageObject cont.class HomePage(driver: WebDriver) extends Page[HomePage]("mainForm:

isLoggedIn", driver) {

def goToUserManagementPage () =

click(id("mainForm:mainNavPTS:0:usersPTText" ))

.expecting[UserManagementPage]

def goToReportPage() =

click(id("mainForm:mainNavPTS:0:reportsPTText" ))

.expecting[ReportPage]

}

Use caseclass UserManagementWebTest extends WebDriverAccess {

var homePage: HomePage = _

@Test

def shouldLandOnUserManagement {

val loginPage: LoginPage = LoginPage.open(

server = Settings.url, port = Settings.

port)

homePage = loginPage.login()

val mngPage: UserManagementPage = homePage.goToUserManagementPage()

assertThat(mngPage.text, containsString( "Create new User" ))

}

That’s it!

Q & A