2017-10-05 3 views
0

저는 scala를 처음 사용합니다. 내 질문과 관련된 다음 네 가지 클래스는 스칼라에서 설계된 테스트 자동화 프레임 워크에 있습니다. 그것은 그것의 인스턴스가 슈퍼 클래스 (PageObject가)의 등의 방법으로 전달되는 슈퍼 클래스가 그 구성원을 포함하지 않는 경우는 객체 (LoginPage)의 액세스 회원 (년, 월, 일)에 가능메소드에 전달 될 때 객체의 배타적 멤버에 인스턴스/유형으로 액세스합니다.

trait PageObject { 
    val rootUrl = "http://localhost:9999/basic-page" 
    val back = "backLink" 
    val submit = "submit" 
    val url: String 
    val heading: String 
} 


object LoginPage extends PageObject { 
    val url =s"$rootUrl/login-page" 
    val heading = "Heading heading" 
    val day = "login_page_day" 
    val month = "login_page__month" 
    val year = "login_page__year" 
} 


import LoginPage 
object Main { 
    def main(args: Array[String]) { 
    val date = "15 August 2017" 
    enterDateOnPage(date, LoginPage) 
    } 
} 

<current way> 
class DateMethods {  
    def enterDateOnPage(date: String, page: PageObject) { 
    val arr = date.split(" ") 
    val cal = Calendar.getInstance() 
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1))) 
    numberField(LoginPage.day).value = arr(0) 
    numberField(LoginPage.month).value = (cal.get(Calendar.MONTH) + 1).toString 
    numberField(LoginPage.year).value = arr(2) 
    click on name(LoginPage.submit) 
    } 
} 

<preferred way> 
class DateMethods {  
     def enterDateOnPage(date: String, page: PageObject) { 
     val arr = date.split(" ") 
     val cal = Calendar.getInstance() 
     cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1))) 
     numberField(page.day).value = arr(0) 
     numberField(page.month).value = (cal.get(Calendar.MONTH) + 1).toString 
     numberField(page.year).value = arr(2) 
     click on name(page.submit) 
     } 
    } 

pageMatch가 LoginPage를 실제로 반환하는지 확인한 후 'LoginPage.day'와 같은 항목을 'page.day'로 바꿀 수 있습니까?

나는 사무엘 히니의 답변에 따라이 같은 시도 않았지만 내가 PageObject의 특성에 구성원으로 일, 월 및 연도를 추가하는 경우

def enterDateOnPage(date: String, page: PageObject) { 
    val npage = getPage(page) 

    val arr = date.split(" ") 
    val cal = Calendar.getInstance() 
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1))) 

    numberField(npage.day).value = arr(0) 
    numberField(npage.month).value = (cal.get(Calendar.MONTH) + 1).toString 
    numberField(npage.year).value = arr(2) 
    click on name(npage.submit) 


    } 

    def getPage(page:PageObject)={ 
    page match{ 
     case _:LoginPage.type => LoginPage 
     case _:EntryFormPage.type => EntryFormPage 
    } 

만 작동 컴파일되지 않습니다,하지만이 아닙니다 나를위한 실현 가능한 옵션

답변

0

날짜 논리를 특성에 맞게 찾아서 일치시킵니다.

trait Dates { 
    val day: String 
    val month: String 
    val year: String 
} 

case object LoginPage extends PageObject with Dates { 
    val day = "" 
    val month = "" 
    val year = "" 
    // additional code 
} 

이제 함수는 특히

def enterDateOnPage(date: String, page: PageObject) { 
    page match { 
    case datePage: Dates => { 
     // add log to validate date fields 
    } 
    case _ => // no-op 
    } 

    // additional code 
} 
+0

감사합니다. 이 하나는 나를 위해 매력처럼 일했다. –

1

패턴 일치를 사용하여 해당 문자가 LoginPage인지 테스트 할 수 있습니다.

class DateMethods {  
    def enterDateOnPage(date: String, page: PageObject): Unit = { 
    page match { 
     case LoginPage => 
     setUIFields(
      LoginPage.day, 
      LoginPage.month, 
      LoginPage.year, 
      date 
     ) 
     case LogoutPage => 
     setUIFields(...) 
     case EntryFormPage => 
     setUIFields(...) 
    } 
    click on name(page.submit) 
    } 

    def setUIFields(
    day: String, 
    month: String, 
    year: String, 
    date: String 
): Unit = { 
    val arr = date.split(" ") 
    val cal = Calendar.getInstance() 
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1))) 
    numberField(day).value = arr(0) 
    numberField(month).value = (cal.get(Calendar.MONTH) + 1).toString 
    numberField(year).value = arr(2) 
    } 
} 
+0

내가 여러 페이지를 작동 할 수있는 솔루션을 더 찾고 있던 특성에 일치시킬 수 있습니다. 내가 전달하는 모든 유형의 페이지에 대해 코드를 반복해야한다면 모든 페이지에 공통적 인 방법을 사용하는 것이 좋습니다. 예를 들어, LoginPage, LogoutPage, EntryFormPage가 모두 PageObject를 확장하게 할 수 있습니다. 그리고 모든 메소드를 처리 할 수있는 메소드가 필요합니다. –

+0

코드를 반복하지 않으려면 다른 매개 변수로 호출 할 수있는 메서드를 사용할 수 있습니까? 예를 들어 대답을 업데이트했습니다. –