diff --git a/build.gradle b/build.gradle index 8c00bc2..368d1a4 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ repositories { } dependencies { - compile "io.appium:java-client:5.0.4" + compile "io.appium:java-client:6.1.0" compile "org.jbehave:jbehave-core:4.3.3" compile "org.jbehave:jbehave-spring:4.3.3" compile "org.projectlombok:lombok:1.16.18" diff --git a/src/main/java/ru/colibri/ui/settings/android/base/BaseAndroidDriverConfigurator.java b/src/main/java/ru/colibri/ui/settings/android/base/BaseAndroidDriverConfigurator.java index 4b25dbc..d9e1658 100644 --- a/src/main/java/ru/colibri/ui/settings/android/base/BaseAndroidDriverConfigurator.java +++ b/src/main/java/ru/colibri/ui/settings/android/base/BaseAndroidDriverConfigurator.java @@ -11,6 +11,7 @@ public abstract class BaseAndroidDriverConfigurator extends AbsDriverConfigurator { + @Override public AppiumDriver createDriver(DriversSettings driversSettings, AppSettings appSettings) { DesiredCapabilities capabilities = createCapabilities(driversSettings); additionalAndroidCapabilities(appSettings, capabilities, driversSettings); diff --git a/src/main/java/ru/colibri/ui/steps/android/AndroidTextFieldSteps.java b/src/main/java/ru/colibri/ui/steps/android/AndroidTextFieldSteps.java new file mode 100644 index 0000000..e701e57 --- /dev/null +++ b/src/main/java/ru/colibri/ui/steps/android/AndroidTextFieldSteps.java @@ -0,0 +1,20 @@ +package ru.colibri.ui.steps.android; + +import org.jbehave.core.annotations.Named; +import org.jbehave.core.annotations.When; +import org.openqa.selenium.By; +import org.springframework.stereotype.Component; +import ru.colibri.ui.steps.general.TextFieldSteps; +import ru.yandex.qatools.allure.annotations.Step; + +@Component +public class AndroidTextFieldSteps extends TextFieldSteps { + + private static final By editTextLocator = By.xpath("//*[contains(@class,'EditText')]"); + + @Step + @When("ввод текста с клавиатуры \"$textOrKeyword\"") + public void sendKeyboardText(@Named("$textOrKeyword") String textOrKeyword) { + sendText(textOrKeyword, editTextLocator); + } +} \ No newline at end of file diff --git a/src/main/java/ru/colibri/ui/steps/android/BaseAndroidSystemButtonsSteps.java b/src/main/java/ru/colibri/ui/steps/android/BaseAndroidSystemButtonsSteps.java index f3f1c81..ed55152 100644 --- a/src/main/java/ru/colibri/ui/steps/android/BaseAndroidSystemButtonsSteps.java +++ b/src/main/java/ru/colibri/ui/steps/android/BaseAndroidSystemButtonsSteps.java @@ -1,7 +1,8 @@ package ru.colibri.ui.steps.android; import io.appium.java_client.android.AndroidDriver; -import io.appium.java_client.android.AndroidKeyCode; +import io.appium.java_client.android.nativekey.AndroidKey; +import io.appium.java_client.android.nativekey.KeyEvent; import org.jbehave.core.annotations.When; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -16,25 +17,25 @@ public class BaseAndroidSystemButtonsSteps extends AbsSteps implements ISystemBu @Step @When("выполнено нажатие на Меню") public void systemMenuClick() { - ((AndroidDriver) driver).pressKeyCode(AndroidKeyCode.MENU); + ((AndroidDriver) driver).pressKey(new KeyEvent(AndroidKey.MENU)); } @Step @When("выполнено нажатие на Хоум") public void systemHomeClick() { - ((AndroidDriver) driver).pressKeyCode(AndroidKeyCode.HOME); + ((AndroidDriver) driver).pressKey(new KeyEvent(AndroidKey.HOME)); } @Override @Step @When("выполнено нажатие на Назад") public void systemBackClick() { - ((AndroidDriver) driver).pressKeyCode(AndroidKeyCode.BACK); + ((AndroidDriver) driver).pressKey(new KeyEvent(AndroidKey.BACK)); } @Step @When("выполнено нажатие на Enter") public void systemEnterClick() { - ((AndroidDriver) driver).pressKeyCode(AndroidKeyCode.KEYCODE_ENTER); + ((AndroidDriver) driver).pressKey(new KeyEvent(AndroidKey.ENTER)); } } diff --git a/src/main/java/ru/colibri/ui/steps/general/ButtonsSteps.java b/src/main/java/ru/colibri/ui/steps/general/ButtonsSteps.java index 8e5de56..860f29e 100644 --- a/src/main/java/ru/colibri/ui/steps/general/ButtonsSteps.java +++ b/src/main/java/ru/colibri/ui/steps/general/ButtonsSteps.java @@ -12,6 +12,8 @@ import java.util.List; +import static io.appium.java_client.touch.offset.ElementOption.element; + @Component public class ButtonsSteps extends AbsSteps { @@ -35,7 +37,7 @@ public void optionalButtonClick(@Named("$button") String button) { @Step @When("выполнен лонгтап на \"$button\"") public void buttonLongtap(@Named("$button") String button) { - new TouchAction(driver).longPress(getWebElementByName(button)).release().perform(); + new TouchAction(driver).longPress(element(getWebElementByName(button))).release().perform(); } @Step @@ -44,6 +46,6 @@ public void listItemLongtap(String fieldName, int index) { IElement element = getCurrentPage().getElementByName(fieldName); List elementsFound = finder.findWebElements(element); WebElement firstElement = elementsFound.get(index); - new TouchAction(driver).longPress(firstElement).release().perform(); + new TouchAction(driver).longPress(element(firstElement)).release().perform(); } } diff --git a/src/main/java/ru/colibri/ui/steps/general/SwipeSteps.java b/src/main/java/ru/colibri/ui/steps/general/SwipeSteps.java index 08b16ee..beca3db 100644 --- a/src/main/java/ru/colibri/ui/steps/general/SwipeSteps.java +++ b/src/main/java/ru/colibri/ui/steps/general/SwipeSteps.java @@ -7,6 +7,10 @@ import java.time.Duration; +import static io.appium.java_client.touch.WaitOptions.waitOptions; +import static io.appium.java_client.touch.offset.ElementOption.element; +import static io.appium.java_client.touch.offset.ElementOption.point; + @Component public class SwipeSteps extends AbsSteps { @@ -14,9 +18,9 @@ public class SwipeSteps extends AbsSteps { protected void verticalSwipe(String elementName, int swipeLength, int duration) { WebElement webElement = getWebElementByName(elementName); new TouchAction(driver) - .press(webElement) - .waitAction(Duration.ofSeconds(duration)) - .moveTo(0, swipeLength) + .press(element(webElement)) + .waitAction(waitOptions(Duration.ofSeconds(duration))) + .moveTo(point(0, swipeLength)) .release().perform(); } @@ -24,9 +28,9 @@ protected void verticalSwipe(String elementName, int swipeLength, int duration) protected void horizontalSwipe(String elementName, int swipeLength, int duration) { WebElement webElement = getWebElementByName(elementName); new TouchAction(driver) - .press(webElement) - .waitAction(Duration.ofSeconds(duration)) - .moveTo(swipeLength, 0) + .press(element(webElement)) + .waitAction(waitOptions(Duration.ofSeconds(duration))) + .moveTo(point(swipeLength, 0)) .release().perform(); } diff --git a/src/main/java/ru/colibri/ui/steps/general/TextFieldSteps.java b/src/main/java/ru/colibri/ui/steps/general/TextFieldSteps.java index 77cf464..d57f53d 100644 --- a/src/main/java/ru/colibri/ui/steps/general/TextFieldSteps.java +++ b/src/main/java/ru/colibri/ui/steps/general/TextFieldSteps.java @@ -1,31 +1,48 @@ package ru.colibri.ui.steps.general; -import io.appium.java_client.MobileElement; +import lombok.extern.java.Log; import org.jbehave.core.annotations.Named; import org.jbehave.core.annotations.When; +import org.openqa.selenium.By; import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Keyboard; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.colibri.ui.core.steps.AbsSteps; import ru.colibri.ui.settings.general.PropertyUtils; import ru.yandex.qatools.allure.annotations.Step; +import java.util.List; +import java.util.logging.Level; + +@Log @Component public class TextFieldSteps extends AbsSteps { + @Autowired private PropertyUtils propertyUtils; + @When("очистить \"$fieldName\"") + public void clearField(@Named("$fieldName") String fieldName) { + WebElement webElement = getWebElementByName(fieldName); + try { + webElement.clear(); + } catch (WebDriverException ignored) { + } + for (int i = webElement.getText().length(); i > 0; i--) { + webElement.sendKeys(Keys.BACK_SPACE); + } + } + @Step @When("поле \"$field\" заполняется значением \"$valueOrKeyword\"") public void sendKeys(@Named("$field") String field, @Named("$valueOrKeyword") String valueOrKeyword) { WebElement webElement = getWebElementByName(field); String value = propertyUtils.injectProperties(valueOrKeyword); - ((MobileElement) webElement).setValue(value); + webElement.sendKeys(value); } - @Step @When("(Optional) поле \"$field\" заполняется значением \"$valueOrKeyword\"") public void optionalSendKeys(@Named("$field") String field, @Named("$valueOrKeyword") String valueOrKeyword) { @@ -36,20 +53,19 @@ public void optionalSendKeys(@Named("$field") String field, @Named("$valueOrKeyw } } - @Step - @When("ввод текста с клавиатуры \"$textOrKeyword\"") - public void sendText(@Named("$textOrKeyword") String textOrKeyword) { + protected void sendText(String textOrKeyword, By editTextLocator) { String text = propertyUtils.injectProperties(textOrKeyword); - driver.getKeyboard().sendKeys(text); - } - - @When("очистить \"$fieldName\"") - public void clearField(@Named("$fieldName") String fieldName) { - WebElement webElement = getWebElementByName(fieldName); - webElement.clear(); - Keyboard keyboard = driver.getKeyboard(); - for (int i = webElement.getText().length(); i > 0; i--) { - keyboard.sendKeys(Keys.BACK_SPACE); + List elements = driver.findElements(editTextLocator); + WebElement activeElement = null; + boolean isFocused = false; + for (int i = 0; !isFocused && i < elements.size(); i++) { + activeElement = (WebElement) elements.get(i); + isFocused = Boolean.valueOf(activeElement.getAttribute("focused")); + } + if (isFocused) { + activeElement.sendKeys(text); + } else { + log.log(Level.SEVERE, "Нет активных полей ввода!"); } } } \ No newline at end of file diff --git a/src/main/java/ru/colibri/ui/steps/ios/BaseIOSPickerWheelSteps.java b/src/main/java/ru/colibri/ui/steps/ios/BaseIOSPickerWheelSteps.java index 8bd1412..611c03b 100644 --- a/src/main/java/ru/colibri/ui/steps/ios/BaseIOSPickerWheelSteps.java +++ b/src/main/java/ru/colibri/ui/steps/ios/BaseIOSPickerWheelSteps.java @@ -11,6 +11,8 @@ import ru.colibri.ui.core.steps.AbsSteps; import ru.yandex.qatools.allure.annotations.Step; +import static io.appium.java_client.touch.offset.PointOption.point; + @Component public class BaseIOSPickerWheelSteps extends AbsSteps { @@ -42,7 +44,7 @@ public void setFirstPickerWheelValue() { int height = size.getHeight(); Point target = new Point(center.getX(), center.getY() - (int) (height * stepToLast)); TouchAction touchAction = new TouchAction(driver); - touchAction.press(target.getX(), target.getY()).release(); + touchAction.press(point(target.getX(), target.getY())).release(); touchAction.perform(); } @@ -55,7 +57,7 @@ public void setLastPickerWheelValue() { int height = size.getHeight(); Point target = new Point(center.getX(), center.getY() + (int) (height * stepToLast)); TouchAction touchAction = new TouchAction(driver); - touchAction.press(target.getX(), target.getY()).release(); + touchAction.press(point(target.getX(), target.getY())).release(); touchAction.perform(); } @@ -74,7 +76,7 @@ public void setNextPickerWheelValue(WebElement pickerWheelElement, double step) Dimension size = pickerWheelElement.getSize(); int height = size.getHeight(); TouchAction touchAction = new TouchAction(driver); - touchAction.press(center.getX(), center.getY() + (int) (height * step)).release(); + touchAction.press(point(center.getX(), center.getY() + (int) (height * step))).release(); touchAction.perform(); } @@ -84,7 +86,7 @@ public void setPrevPickerWheelValue(WebElement pickerWheelElement, double step) Dimension size = pickerWheelElement.getSize(); int height = size.getHeight(); TouchAction touchAction = new TouchAction(driver); - touchAction.press(center.getX(), center.getY() - (int) (height * step)).release(); + touchAction.press(point(center.getX(), center.getY() - (int) (height * step))).release(); touchAction.perform(); } } diff --git a/src/main/java/ru/colibri/ui/steps/ios/IOSButtonSteps.java b/src/main/java/ru/colibri/ui/steps/ios/IOSButtonSteps.java index 5451aaf..23804b0 100644 --- a/src/main/java/ru/colibri/ui/steps/ios/IOSButtonSteps.java +++ b/src/main/java/ru/colibri/ui/steps/ios/IOSButtonSteps.java @@ -18,6 +18,17 @@ public void clickOnReadyButton() { driver.findElement(MobileBy.iOSNsPredicateString(readyButton)).click(); } + @Step + @When("(Optional) нажата кнопка Готово") + public void clickOnReadyButtonOptional() { + decreaseImplicitlyWait(); + try { + clickOnReadyButton(); + } catch (Exception ignored) { + } + increaseImplicitlyWait(); + } + @Step @When("нажата кнопка Отмена") public void clickOnCancelButton() { diff --git a/src/main/java/ru/colibri/ui/steps/ios/IOSTextFieldSteps.java b/src/main/java/ru/colibri/ui/steps/ios/IOSTextFieldSteps.java new file mode 100644 index 0000000..d995d57 --- /dev/null +++ b/src/main/java/ru/colibri/ui/steps/ios/IOSTextFieldSteps.java @@ -0,0 +1,26 @@ +package ru.colibri.ui.steps.ios; + +import io.appium.java_client.MobileBy; +import org.jbehave.core.annotations.Named; +import org.jbehave.core.annotations.When; +import org.openqa.selenium.By; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.colibri.ui.settings.general.PropertyUtils; +import ru.colibri.ui.steps.general.TextFieldSteps; +import ru.yandex.qatools.allure.annotations.Step; + +@Component +public class IOSTextFieldSteps extends TextFieldSteps { + + private static final By editTextLocator = MobileBy.iOSNsPredicateString("type like 'XCUIElementTypeTextField'"); + + @Autowired + private PropertyUtils propertyUtils; + + @Step + @When("ввод текста с клавиатуры \"$textOrKeyword\"") + public void sendKeyboardText(@Named("$textOrKeyword") String textOrKeyword) { + sendText(textOrKeyword, editTextLocator); + } +} \ No newline at end of file