빡센 하드코딩의 흔적.........
때는 2023년 12월.. 여러 항목을 탭하는 테스트 코드를 작성하던 나..
appium에서 제공해주는 클릭 메소드는 id 하나하나에 접근해 실행시킨다.
하지만 이젠 하드코딩은 그만하고 싶어.. 아이디를 찾는 것 까진 오케이 > 근데 비슷한 아이디의 형태가 주어진다면 혹은 아이디에 공통적인 규칙이 있다면 해당 아이디를 모두 조회해서 리스트로 뽑을 순 없을 까?🤔
predicate란 fetch 혹은 메모리 내에서 어떤 값을 가져올때 메모리의 filter에 대한 제약 조건
appium에서도 IOS_PREDICATE 라는 메소드로 해당 기능 제공한다. 즉 어떤 값을 가져올 때 조건을 걸 수 있다는 얘기!
나의 경우 데이터에 따라 계속해서 id나 name값이 변하는 element가 있었다. 이를 partical하게 조회하기 위한 방법을 찾던 중 iOS Predicate를 알게되었다.
ex) 예를 들어 내가 찾고자 하는 항목의 id값이 데이터의 개수에 따라서 변한다면
- len(data) = 5
- element ID: 'element_id_5'
- len(data) = 3
- element ID: 'element_id_3'
해당 id의 공통 부분은 element_id
이며 이를 통해 유니크한 id값 하나가 아닐지라도 iOS Predicate를 이용해 해당 항목에 접근할 수 있다.
# iOS Predicate 사용
element = driver.find_element(by=AppiumBy.IOS_PREDICATE, value="name CONTAINS 'element_id_'")
해당 메소드 기능을 활용해 반복되는 부분을 리팩토링하자!
# 해당 글자가 포함되는 아이디 리스트를 elements_list 변수에 저장
elements_list = driver.find_elements(by=MobileBy.IOS_PREDICATE, value="name CONTAINS 'element_id_'")
# for문으로 해당 리스트의 항목들 클릭
for i in range(len(elements_list)):
elements[i].click()