From d54e74459f673347fde6ce35f1a9afe2ca8eb0d7 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 8 Jul 2020 12:27:19 +0200 Subject: [PATCH 1/6] fix: Parse platformName if it was passed as enum item --- .../io/appium/java_client/AppiumDriver.java | 3 +- .../internal/CapabilityHelpers.java | 10 ++++-- .../JsonToMobileElementConverter.java | 6 ++-- .../pagefactory/AppiumFieldDecorator.java | 32 ++++++++----------- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/appium/java_client/AppiumDriver.java b/src/main/java/io/appium/java_client/AppiumDriver.java index 049171912..6d91b7b0a 100644 --- a/src/main/java/io/appium/java_client/AppiumDriver.java +++ b/src/main/java/io/appium/java_client/AppiumDriver.java @@ -40,6 +40,7 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.html5.Location; +import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.DriverCommand; import org.openqa.selenium.remote.ErrorHandler; @@ -316,7 +317,7 @@ public URL getRemoteAddress() { @Override public boolean isBrowser() { - String browserName = CapabilityHelpers.getCapability(getCapabilities(), "browserName", String.class); + String browserName = CapabilityHelpers.getCapability(getCapabilities(), CapabilityType.BROWSER_NAME, String.class); if (!isBlank(browserName)) { try { return (boolean) executeScript("return !!window.navigator;"); diff --git a/src/main/java/io/appium/java_client/internal/CapabilityHelpers.java b/src/main/java/io/appium/java_client/internal/CapabilityHelpers.java index 8688eef13..b97da189c 100644 --- a/src/main/java/io/appium/java_client/internal/CapabilityHelpers.java +++ b/src/main/java/io/appium/java_client/internal/CapabilityHelpers.java @@ -43,8 +43,14 @@ public static T getCapability(Capabilities caps, String name, Class expec possibleNames.add(APPIUM_PREFIX + name); } for (String capName : possibleNames) { - if (caps.getCapability(capName) != null - && expectedType.isAssignableFrom(caps.getCapability(capName).getClass())) { + if (caps.getCapability(capName) == null) { + continue; + } + + if (expectedType == String.class) { + return expectedType.cast(String.valueOf(caps.getCapability(capName))); + } + if (expectedType.isAssignableFrom(caps.getCapability(capName).getClass())) { return expectedType.cast(caps.getCapability(capName)); } } diff --git a/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java b/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java index 22cce7275..9f8674a90 100644 --- a/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java +++ b/src/main/java/io/appium/java_client/internal/JsonToMobileElementConverter.java @@ -18,8 +18,10 @@ import static io.appium.java_client.internal.ElementMap.getElementClass; +import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.remote.RemoteWebElement; import org.openqa.selenium.remote.internal.JsonToWebElementConverter; @@ -46,8 +48,8 @@ public JsonToMobileElementConverter(RemoteWebDriver driver) { super(driver); this.driver = driver; Capabilities caps = driver.getCapabilities(); - this.platform = CapabilityHelpers.getCapability(caps, "platformName", String.class); - this.automation = CapabilityHelpers.getCapability(caps, "automationName", String.class); + this.platform = CapabilityHelpers.getCapability(caps, CapabilityType.PLATFORM_NAME, String.class); + this.automation = CapabilityHelpers.getCapability(caps, MobileCapabilityType.AUTOMATION_NAME, String.class); } @Override diff --git a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java index 933795729..1d2b9caa0 100644 --- a/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java +++ b/src/main/java/io/appium/java_client/pagefactory/AppiumFieldDecorator.java @@ -29,13 +29,14 @@ import io.appium.java_client.ios.IOSElement; import io.appium.java_client.pagefactory.bys.ContentType; import io.appium.java_client.pagefactory.locator.CacheableLocator; +import io.appium.java_client.remote.MobileCapabilityType; import io.appium.java_client.windows.WindowsElement; import org.openqa.selenium.Capabilities; import org.openqa.selenium.HasCapabilities; import org.openqa.selenium.SearchContext; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.RemoteWebElement; import org.openqa.selenium.support.pagefactory.DefaultFieldDecorator; import org.openqa.selenium.support.pagefactory.ElementLocator; @@ -49,6 +50,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -88,8 +90,8 @@ public AppiumFieldDecorator(SearchContext context, Duration duration) { if (this.webDriver instanceof HasCapabilities) { Capabilities caps = ((HasCapabilities) this.webDriver).getCapabilities(); - this.platform = CapabilityHelpers.getCapability(caps, "platformName", String.class); - this.automation = CapabilityHelpers.getCapability(caps, "automationName", String.class); + this.platform = CapabilityHelpers.getCapability(caps, CapabilityType.PLATFORM_NAME, String.class); + this.automation = CapabilityHelpers.getCapability(caps, MobileCapabilityType.AUTOMATION_NAME, String.class); } else { this.platform = null; this.automation = null; @@ -107,8 +109,7 @@ protected WebElement proxyForLocator(ClassLoader ignored, ElementLocator locator @Override @SuppressWarnings("unchecked") - protected List proxyForListLocator(ClassLoader ignored, - ElementLocator locator) { + protected List proxyForListLocator(ClassLoader ignored, ElementLocator locator) { ElementListInterceptor elementInterceptor = new ElementListInterceptor(locator); return getEnhancedProxy(ArrayList.class, elementInterceptor); } @@ -125,19 +126,12 @@ protected boolean isDecoratableList(Field field) { } Type listType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; + List bounds = (listType instanceof TypeVariable) + ? Arrays.asList(((TypeVariable) listType).getBounds()) + : Collections.emptyList(); - for (Class webElementClass : availableElementClasses) { - if (webElementClass.equals(listType)) { - return true; - } - } - - if ((listType instanceof TypeVariable) - && Arrays.asList(((TypeVariable) listType).getBounds()) - .stream().anyMatch(item -> availableElementClasses.contains(item))) { - return true; - } - return false; + return availableElementClasses.stream() + .anyMatch((webElClass) -> webElClass.equals(listType) || bounds.contains(webElClass)); } }; @@ -188,10 +182,10 @@ private Object decorateWidget(Field field) { } if (listType instanceof Class) { - if (!Widget.class.isAssignableFrom((Class) listType)) { + if (!Widget.class.isAssignableFrom((Class) listType)) { return null; } - widgetType = Class.class.cast(listType); + widgetType = (Class) listType; } else { return null; } From 80c8d5aeb908d3c8335bb3b67c3d67ae7acc34a8 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 8 Jul 2020 12:45:11 +0200 Subject: [PATCH 2/6] Fix linter --- src/main/java/io/appium/java_client/AppiumDriver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/AppiumDriver.java b/src/main/java/io/appium/java_client/AppiumDriver.java index 6d91b7b0a..32785d1eb 100644 --- a/src/main/java/io/appium/java_client/AppiumDriver.java +++ b/src/main/java/io/appium/java_client/AppiumDriver.java @@ -317,7 +317,8 @@ public URL getRemoteAddress() { @Override public boolean isBrowser() { - String browserName = CapabilityHelpers.getCapability(getCapabilities(), CapabilityType.BROWSER_NAME, String.class); + String browserName = CapabilityHelpers.getCapability(getCapabilities(), + CapabilityType.BROWSER_NAME, String.class); if (!isBlank(browserName)) { try { return (boolean) executeScript("return !!window.navigator;"); From a6ef9b00e5f1e0333440124c1af5cc4c51068294 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 8 Jul 2020 12:54:18 +0200 Subject: [PATCH 3/6] Tune CI env --- azure-pipelines.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 39ffdeb6b..224c06af3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -4,24 +4,24 @@ # https://docs.microsoft.com/azure/devops/pipelines/languages/java pool: - vmImage: 'macOS 10.14' + vmImage: 'macOS 10.15' variables: ANDROID_EMU_NAME: test ANDROID_EMU_ABI: x86 ANDROID_EMU_TARGET: android-27 ANDROID_EMU_TAG: google_apis - XCODE_VERSION: 10.2 - IOS_PLATFORM_VERSION: 12.2 + XCODE_VERSION: 11.5 + IOS_PLATFORM_VERSION: 13.5 IOS_DEVICE_NAME: iPhone X jobs: - job: E2E_Tests - timeoutInMinutes: 60 + timeoutInMinutes: '60' steps: - task: NodeTool@0 inputs: - versionSpec: '11.x' + versionSpec: '12.x' - script: | echo "Configuring Environment" @@ -43,7 +43,7 @@ jobs: npm config set prefix $NVM_DIR/versions/node/`node --version` node --version - npm install -g appium@beta + npm install -g appium appium --version java -version From 97d7559e7e32f4c8bcda292a627eb999fc413380 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 8 Jul 2020 12:57:20 +0200 Subject: [PATCH 4/6] Fix image name --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 224c06af3..e7eb7bacf 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -4,7 +4,7 @@ # https://docs.microsoft.com/azure/devops/pipelines/languages/java pool: - vmImage: 'macOS 10.15' + vmImage: 'macOS-10.15' variables: ANDROID_EMU_NAME: test From 32c182993fd8bf449d8bc6c543b05a9462d56e48 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Thu, 9 Jul 2020 08:42:22 +0200 Subject: [PATCH 5/6] Switch back to beta --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e7eb7bacf..f2d020e67 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -43,7 +43,7 @@ jobs: npm config set prefix $NVM_DIR/versions/node/`node --version` node --version - npm install -g appium + npm install -g appium@beta appium --version java -version From f22a03346f972714bb387ff680ce9dd577b1351f Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Thu, 9 Jul 2020 10:56:24 +0200 Subject: [PATCH 6/6] Update tests --- .../appium/java_client/ios/IOSTouchTest.java | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/test/java/io/appium/java_client/ios/IOSTouchTest.java b/src/test/java/io/appium/java_client/ios/IOSTouchTest.java index 247e167d1..560fb2245 100644 --- a/src/test/java/io/appium/java_client/ios/IOSTouchTest.java +++ b/src/test/java/io/appium/java_client/ios/IOSTouchTest.java @@ -5,7 +5,6 @@ import static io.appium.java_client.touch.WaitOptions.waitOptions; import static io.appium.java_client.touch.offset.ElementOption.element; import static java.time.Duration.ofMillis; -import static java.time.Duration.ofSeconds; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.openqa.selenium.support.ui.ExpectedConditions.alertIsPresent; @@ -13,11 +12,9 @@ import io.appium.java_client.MobileElement; import io.appium.java_client.MultiTouchAction; import io.appium.java_client.TouchAction; -import io.appium.java_client.touch.offset.ElementOption; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; -import org.openqa.selenium.Dimension; import org.openqa.selenium.support.ui.WebDriverWait; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -33,7 +30,7 @@ public void tapTest() { intB.sendKeys("4"); MobileElement e = driver.findElementByAccessibilityId("ComputeSumButton"); - new TouchAction(driver).tap(tapOptions().withElement(element(e))).perform(); + new IOSTouchAction(driver).tap(tapOptions().withElement(element(e))).perform(); assertEquals(driver.findElementByXPath("//*[@name = \"Answer\"]").getText(), "6"); } @@ -57,28 +54,12 @@ public void touchWithPressureTest() { assertEquals(driver.findElementByXPath("//*[@name = \"Answer\"]").getText(), "6"); } - @Test public void swipeTest() { - WebDriverWait webDriverWait = new WebDriverWait(driver, 30); - IOSElement slider = webDriverWait.until(driver1 -> driver.findElementByClassName("XCUIElementTypeSlider")); - Dimension size = slider.getSize(); - - ElementOption press = element(slider, size.width / 2 + 2, size.height / 2); - ElementOption move = element(slider, 1, size.height / 2); - - TouchAction swipe = new TouchAction(driver).press(press) - .waitAction(waitOptions(ofSeconds(2))) - .moveTo(move).release(); - - swipe.perform(); - assertEquals("0%", slider.getAttribute("value")); - } - @Test public void multiTouchTest() { MobileElement e = driver.findElementByAccessibilityId("ComputeSumButton"); MobileElement e2 = driver.findElementByAccessibilityId("show alert"); - TouchAction tap1 = new TouchAction(driver).tap(tapOptions().withElement(element(e))); - TouchAction tap2 = new TouchAction(driver).tap(tapOptions().withElement(element(e2))); + IOSTouchAction tap1 = new IOSTouchAction(driver).tap(tapOptions().withElement(element(e))); + IOSTouchAction tap2 = new IOSTouchAction(driver).tap(tapOptions().withElement(element(e2))); new MultiTouchAction(driver).add(tap1).add(tap2).perform();