Shirates에서 화면 닉네임을 사용하는 방법 - Part2 -
재료
[ https://github.com/wave1008/shirates-samples-nicknames ]에서 완전한 샘플 프로젝트를 얻을 수 있습니다.
예 2: Android 설정
이 샘플은 Android 설정 앱에서 4개의 화면을 사용하여 화면 닉네임을 사용하는 방법을 보여줍니다.
설정 화면
시스템 화면/언어 및 입력 화면/언어 화면
[안드로이드 설정 상단 화면].json
{
"key": "[Android Settings Top Screen]",
"identity": "#recycler_view",
"satellites": ["Battery", "Accessibility", "Passwords & accounts", "Tips & support"],
"selectors": {
"[Account Avatar]": "#account_avatar",
"[Settings]": "#homepage_title",
"[Search Button]": "<#search_action_bar>:inner(1)",
"[Search settings]": "#search_action_bar_title",
"[Network & internet]": "",
"{Network & internet}": "[Network & internet]:label",
"[Network & internet Icon]": "[Network & internet]:leftImage",
"[Connected devices]": "",
"{Connected devices}": "[Connected devices]:label",
"[Connected devices Icon]": "[Connected devices]:leftImage",
"[Apps]": "",
"{Apps}": "[Apps]:label",
"[Apps Icon]": "[Apps]:leftImage",
"[Notifications]": "",
"{Notifications}": "[Notifications]:label",
"[Notifications Icon]": "[Notifications]:leftImage",
"[Battery]": "",
"{Battery}": "[Battery]:label",
"[Battery Icon]": "[Battery]:leftImage",
"[Storage]": "",
"{Storage}": "[Storage]:label",
"[Storage Icon]": "[Storage]:leftImage",
"[Sound & vibration]": "",
"{Sound & vibration}": "[Sound & vibration]:label",
"[Sound & vibration Icon]": "[Sound & vibration]:leftImage",
"[Display]": "",
"{Display}": "[Display]:label",
"[Display Icon]": "[Display]:leftImage",
"[Wallpaper & style]": "",
"{Wallpaper & style}": "[Wallpaper & style]:label",
"[Wallpaper & style Icon]": "[Wallpaper & style]:leftImage",
"[Accessibility]": "",
"{Accessibility}": "[Accessibility]:label",
"[Accessibility Icon]": "[Accessibility]:leftImage",
"[Security]": "",
"{Security}": "[Security]:label",
"[Security Icon]": "[Security]:leftImage",
"[Privacy]": "",
"{Privacy}": "[Privacy]:label",
"[Privacy Icon]": "[Privacy]:leftImage",
"[Location]": "",
"{Location}": "[Location]:label",
"[Location Icon]": "[Location]:leftImage",
"[Safety & emergency]": "",
"{Safety & emergency}": "[Safety & emergency]:label",
"[Safety & emergency Icon]": "[Safety & emergency]:leftImage",
"[Passwords & accounts]": "",
"{Passwords & accounts}": "[Passwords & accounts]:label",
"[Passwords & accounts Icon]": "[Passwords & accounts]:leftImage",
"[Google]": "",
"{Google}": "[Google]:label",
"[Google Icon]": "[Google]:leftImage",
"[System]": "",
"{System}": "[System]:label",
"[System Icon]": "[System]:leftImage",
"[About emulated device]": "",
"{About emulated device}": "[About emulated device]:label",
"[About emulated device Icon]": "[About emulated device]:leftImage",
"[About phone]": "",
"{About phone}": "[About phone]:label",
"[About phone Icon]": "[About phone]:leftImage",
"[Tips & support]": "",
"{Tips & support}": "[Tips & support]:label",
"[Tips & support Icon]": "[Tips & support]:leftImage"
},
"scroll": {
"start-elements": "",
"end-elements": "{Tips & support}",
"overlay-elements": "[Search Button][Search settings]"
}
}
위성과의 신원
Android 설정 앱에는 스크롤 가능한 보기가 있으며 항상 표시되는 고정 식별자가 없습니다. 이 경우
identity
를 satellites
와 함께 사용하여 표시된 화면을 식별할 수 있습니다. "identity": "#recycler_view",
"satellites": ["Battery", "Accessibility", "Passwords & accounts", "Tips & support"],
위의 예에서는
"identity": "#recycler_view"
가 항상 표시되고(고유 식별자는 아님) "satellites"는 Android 설정 보기에 표시되는 구성원 목록입니다. "identity"+"satellites"
는 화면의 고유 식별자로 인식됩니다.상대 선택기
Appium 로케이터는 모든 요소가 고유한 속성을 가지고 있거나 구현될 것이라고 가정하는 것 같습니다. 그러나 실제로는 특히 스크롤 뷰의 경우 고유 식별자가 없는 요소가 많이 있습니다.
Shirates에서는 이 테마를 해결하기 위해 Relative Selector을 도입했습니다. UI 요소 그룹에 고유 식별자가 있는 요소가 하나 이상 있으면 주변 요소를 상대적으로 가져올 수 있습니다.
다음 이미지를 참조하십시오.
"Battery"
는 정적 콘텐츠이며 고유합니다."100%"
는 동적 콘텐츠이며 고유 식별자가 없습니다.배터리 아이콘에는 고유 식별자가 없습니다.
이 경우 다음과 같이 선택자 별칭을 정의할 수 있습니다.
"[Battery]": "",
"{Battery}": "[Battery]:label",
"[Battery Icon]": "[Battery]:leftImage",
:label
는 위젯 흐름에서 다음 레이블을 선택하는 상대 선택기입니다. 참조Relative selector(Widget flow based):leftImage
는 왼쪽 이미지를 선택하는 상대 선택기입니다. Relative selector(Direction based)을 참조하십시오.[시스템 화면].json
{
"key": "[System Screen]",
"include": [
],
"identity": "[<-][System]",
"selectors": {
"[<-]": "@Navigate up",
"[System]": "@System",
"[Languages & input]": "",
"{Languages & input}": "[Languages & input]:belowLabel",
"[Gestures]": "",
"[Date & time]": "",
"{Date & time}": "[Date & time]:belowLabel",
"[Backup]": "",
"[System update]": "",
"{System update}": "[System update]:belowLabel",
"[Rules]": "",
"{Rules}": "[Rules]:belowLabel",
"[Multiple users]": "",
"{Multiple users}": "[Multiple users]:belowLabel",
"[Developer options]": "",
"{Developer options}": "[Developer options]:belowLabel",
"[Reset options]": ""
}
}
[언어 및 입력화면].json
{
"key": "[Languages & input Screen]",
"include": [
],
"identity": "[<-][Languages & input]",
"selectors": {
"[<-]": "@Navigate up",
"[Languages & input]": "@Languages & input",
"[Languages]": "",
"{Languages}": "[Languages]:belowLabel",
"[Languages Icon]": "[Languages]:leftImage",
"[Keyboards]": "",
"[On-screen keyboard]": "",
"{On-screen keyboard}": "[On-screen keyboard]:belowLabel",
"[Physical keyboard]": "",
"{Physical keyboard}": "[Physical keyboard]:belowLabel",
"[Tools]": "",
"[Spell checker]": "",
"{Spell checker}": "[Spell checker]:belowLabel",
"[Personal dictionary]": "",
"{Personal dictionary}": "[Personal dictionary]:belowLabel",
"[Pointer speed]": "",
"[Text-to-speech output]": ""
}
}
[언어 화면].json
{
"key": "[Languages Screen]",
"include": [
],
"identity": "[<-][Languages]",
"selectors": {
"[<-]": "@Navigate up",
"[Languages]": "@Languages",
"[Add a language]": ""
}
}
AndroidSettingsTest
다음은 Screen Nickname 파일이 있거나 없는 Android 설정 테스트 코드입니다. Screen Nickname 파일이 없는 경우에는 content-desc와 같은 하위 식별자를 사용해야 합니다. 반면 Screen Nickname 파일이 있는 경우에는 추상적인 Screen Nickname/Selector Nickname을 사용할 수 있습니다.
package androidSettings
import org.junit.jupiter.api.Order
import org.junit.jupiter.api.Test
import shirates.core.driver.commandextension.*
import shirates.core.testcode.UITest
class AndroidSettingsTest : UITest() {
@Test
@Order(10)
fun withoutNickname() {
scenario {
case(1) {
condition {
it.tapAppIcon("Settings")
.existWithScrollDown("Battery||Accessibility||Passwords & accounts||Tips & support")
}.action {
it.tapWithScrollDown("System")
}.expectation {
it.exist("@Navigate up")
.exist("@System")
}
}
case(2) {
action {
it.tap("Languages & input")
}.expectation {
it.exist("@Navigate up")
.exist("@Languages & input")
}
}
case(3) {
action {
it.tap("Languages")
}.expectation {
it.exist("@Navigate up")
.exist("@Languages")
}
}
}
}
@Test
@Order(20)
fun withNickname() {
scenario {
case(1) {
condition {
it.tapAppIcon("Settings")
.screenIs("[Android Settings Top Screen]")
}.action {
it.tapWithScrollDown("[System]")
}.expectation {
it.screenIs("[System Screen]")
.exist("[<-]")
.exist("[System]")
}
}
case(2) {
action {
it.tap("[Languages & input]")
}.expectation {
it.screenIs("[Languages & input Screen]")
.exist("[Languages]")
}
}
case(3) {
action {
it.tap("[Languages]")
}.expectation {
it.screenIs("[Languages Screen]")
}
}
}
}
}
검사 결과
스크린 닉네임 없이 스크린 닉네임으로 보고 비교해 보세요. 화면 닉네임이 이해하기 더 쉽다는 것을 알 수 있습니다.
_리포트(단순).html
[email protected]
결론
Shirates에서는 Screen Nickname을 JSON 파일로 정의할 수 있습니다. Screen Nickname은 테스트 코드를 읽기 쉽고 생산적으로 만듭니다.
Reference
이 문제에 관하여(Shirates에서 화면 닉네임을 사용하는 방법 - Part2 -), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wave1008/how-to-use-screen-nickname-in-shirates-part2--h50텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)