当对象作为其超类的 instance/type 传递给方法时,访问该对象的独占成员
Access exclusive members of an object when it's passed into a method as an instance/type of it's superclass
我是 Scala 的新手。以下 4 类 与我的问题相关,存在于用 Scala 设计的测试自动化框架中。如果对象 (LoginPage) 作为超类 (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'?
我确实根据 Samuel Heaney 的回答尝试过类似的方法,但无法编译
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
}
仅当我将日、月和年作为成员添加到 PageObject 特征时才有效,但这对我来说不是一个可行的选择
您可以使用模式匹配来测试它是否 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)
}
}
将您的日期逻辑放入其自身的特征中并与之匹配。
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
}
我是 Scala 的新手。以下 4 类 与我的问题相关,存在于用 Scala 设计的测试自动化框架中。如果对象 (LoginPage) 作为超类 (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'?
我确实根据 Samuel Heaney 的回答尝试过类似的方法,但无法编译
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
}
仅当我将日、月和年作为成员添加到 PageObject 特征时才有效,但这对我来说不是一个可行的选择
您可以使用模式匹配来测试它是否 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)
}
}
将您的日期逻辑放入其自身的特征中并与之匹配。
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
}