@Aleksei
test class:
package common.helpers
import com.codeborne.selenide.SelenideElement
import common.ApplicationManager
import constants.Constants
import io.appium.java_client.MobileElement
import io.appium.java_client.pagefactory.AndroidFindBy
import io.appium.java_client.pagefactory.iOSXCUITFindBy
import org.openqa.selenium.interactions.touch.TouchActions
import sсreens.Autorization
import java.lang.Thread.sleep
open class AuthHelper(manager: ApplicationManager) : ApplicationManager() {
var manager: ApplicationManager
init {
this.manager = manager
}
@AndroidFindBy(id = "ua.com.abank:id/btnNext")
@iOSXCUITFindBy(xpath = "//*[contains(@name, 'Дале')]")
private val nextButton: MobileElement? = null
@iOSXCUITFindBy(xpath = "//*[contains(@name, 'Отменить')]")
private val authdScreen: SelenideElement? = null
@iOSXCUITFindBy(accessibility = "ic chat new")
private var fieldFour: SelenideElement? =
fun fullAuth(): Autorization {
when (Constants.RunVariables.PLATFORM) {
Constants.Platform.IOS -> {
nextButton?.click()
tap(fieldFour)
fieldFour?.click()
sleep(3000)
nextButton?.click()
}
Constants.Platform.AOS -> {
manager.getScreen<Autorization>()
.skipPermissions()
.skipAllerScreen()
.enterPhoneNumber()
.setPassCode()
.setOTPCodeAndroid()
}
}
return manager.getScreen()
}
fun reAuth(): Autorization {
when (Constants.RunVariables.PLATFORM) {
Constants.Platform.IOS -> {
manager.getScreen<Autorization>()
.setPassCode()
}
Constants.Platform.AOS -> {
manager.getScreen<Autorization>()
.setPassCode()
}
}
return manager.getScreen()
}
}
ApplicationManager:
package common
import com.codeborne.selenide.Selenide
import com.codeborne.selenide.SelenideElement
import com.codeborne.selenide.WebDriverRunner
import com.codeborne.selenide.appium.ScreenObject.screen
import com.google.common.collect.ImmutableMap
import common.helpers.DataReader.getValue
import constants.Constants
import io.appium.java_client.AppiumDriver
import io.appium.java_client.android.AndroidDriver
import io.appium.java_client.ios.IOSDriver
import io.appium.java_client.remote.AndroidMobileCapabilityType.*
import io.appium.java_client.remote.MobileCapabilityType.*
import org.openqa.selenium.interactions.touch.TouchActions
import org.openqa.selenium.remote.CapabilityType.PLATFORM_NAME
import org.openqa.selenium.remote.DesiredCapabilities
import java.io.File
import java.lang.reflect.Constructor
import java.lang.reflect.InvocationTargetException
import java.net.MalformedURLException
import java.net.URL
import java.util.concurrent.TimeUnit
open class ApplicationManager {
private var driver: AppiumDriver<*>? = null
private val clipboard = Selenide.clipboard()
@JvmName("getDriver1")
fun createDriver(): AppiumDriver<*> {
var driver: AppiumDriver<*>? = null
try {
val url = URL("http://127.0.0.1:4723/wd/hub")
return when (Constants.RunVariables.PLATFORM) {
Constants.Platform.IOS -> {
if (driver == null) {
driver = IOSDriver<SelenideElement>(url, iOSDesiredCapabilities)
}
driver
}
Constants.Platform.AOS -> {
if (driver == null) {
driver = AndroidDriver<SelenideElement>(url, androidDesiredCapabilities)
}
driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS)
driver
}
}
} catch (e: MalformedURLException) {
e.printStackTrace()
}
throw IllegalArgumentException("Cannot detect type of the Driver. Platform value: " + "name")
}
private val androidDesiredCapabilities: DesiredCapabilities
get() {
val appDir = File("src/test/kotlin/app")
val app = File(appDir, "app-debug.apk")
val desiredCapabilities = DesiredCapabilities()
desiredCapabilities.setCapability(DEVICE_NAME, getValue("AOS_DEVICE_NAME"))
desiredCapabilities.setCapability(UDID, getValue("AOS_UDID"))
desiredCapabilities.setCapability(PLATFORM_NAME, "Android")
desiredCapabilities.setCapability(PLATFORM_VERSION, getValue("AOS_PLATFORM_VERSION"))
desiredCapabilities.setCapability(APP_PACKAGE, "*******")
desiredCapabilities.setCapability(APP, app.getAbsolutePath())
// “appium:autoGrantPermissions”: true
desiredCapabilities.setCapability(NO_RESET, true)
desiredCapabilities.setCapability(“appium:autoGrantPermissions”, “true”)
return desiredCapabilities
}
private val iOSDesiredCapabilities: DesiredCapabilities
get() {
val desiredCapabilities = DesiredCapabilities()
desiredCapabilities.setCapability(DEVICE_NAME, getValue("IOS_DEVICE_NAME"))
desiredCapabilities.setCapability("automationName", "XCUITest")
desiredCapabilities.setCapability(PLATFORM_VERSION, getValue("IOS_PLATFORM_VERSION"))
desiredCapabilities.setCapability(PLATFORM_NAME, "iOS")
desiredCapabilities.setCapability(UDID, getValue("IOS_UDID"))
desiredCapabilities.setCapability("autoAcceptAlerts", true)
desiredCapabilities.setCapability("bundleId", "**********")
return desiredCapabilities
}
fun getDriver(): AppiumDriver<*> {
return WebDriverRunner.getWebDriver() as AppiumDriver<*>
}
inline fun <reified T> getHelper(): T {
val clazz: Class<*>?
val constructor: Constructor<*>?
var `object`: Any? = null
try {
clazz = T::class.java
constructor = clazz.getConstructor(ApplicationManager::class.java)
`object` = constructor.newInstance(this)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
} catch (e: NoSuchMethodException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
} catch (e: InstantiationException) {
e.printStackTrace()
} catch (e: InvocationTargetException) {
e.printStackTrace()
}
return `object` as T
}
inline fun <reified T> getScreen(): T {
return screen(T::class.java)
}
fun setClipboardText(text: String) {
clipboard.text = text
}
fun getClipboardText(): String {
return clipboard.text
}
fun tap(text: SelenideElement?) {
val action = TouchActions(driver)
action.singleTap(text)
action.perform()
}
}
My tree:
-ios class chain (docs)
|
**/XCUIElementTypeButton[label == "Далее" ] |
-ios predicate string (docs)
|
label == “Далее” AND name == “Далее” AND type == “XCUIElementTypeButton” |
xpath |
//XCUIElementTypeButton[@name=“Далее”] |
Attribute |
Value |
elementId |
2F000000-0000-0000-7B4D-000000000000 |
type |
XCUIElementTypeButton |
name |
Далее |
label |
Далее |
enabled |
true |
visible |
true |
accessible |
true |
x |
24 |
y |
790 |
width |
366 |
height |
56 |
index |
4 |