From 7440205bdede2af2d3f8001069a6b12955deb5e0 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Mon, 20 Oct 2025 12:23:53 +0200 Subject: [PATCH 1/2] test: Replace iOS test app with VodQA --- .../io/appium/java_client/ios/AppIOSTest.java | 18 ++++--- .../appium/java_client/ios/BaseIOSTest.java | 11 ++--- .../appium/java_client/ios/ClipboardTest.java | 2 +- .../appium/java_client/ios/IOSAlertTest.java | 47 +++++++++---------- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java index 316b05d08..0ef5806fe 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java @@ -1,26 +1,32 @@ package io.appium.java_client.ios; import io.appium.java_client.ios.options.XCUITestOptions; -import io.appium.java_client.utils.TestUtils; import org.junit.jupiter.api.BeforeAll; +import org.openqa.selenium.By; import org.openqa.selenium.SessionNotCreatedException; +import java.net.MalformedURLException; +import java.net.URL; import java.time.Duration; -public class AppIOSTest extends BaseIOSTest { - protected static final String BUNDLE_ID = "io.appium.TestApp"; +import static io.appium.java_client.AppiumBy.accessibilityId; +import static io.appium.java_client.AppiumBy.iOSNsPredicateString; +import static io.appium.java_client.utils.TestUtils.IOS_SIM_VODQA_RELEASE_URL; - private static final String TEST_APP_ZIP = TestUtils.resourcePathToAbsolutePath("TestApp.app.zip").toString(); +public class AppIOSTest extends BaseIOSTest { + protected static final String BUNDLE_ID = "org.reactjs.native.example.VodQAReactNative"; + protected static final By LOGIN_LINK_ID = accessibilityId("login"); + protected static final By PASSWORD_EDIT_PREDICATE = iOSNsPredicateString("name == \"password\""); @BeforeAll - public static void beforeClass() { + public static void beforeClass() throws MalformedURLException { startAppiumServer(); XCUITestOptions options = new XCUITestOptions() .setPlatformVersion(PLATFORM_VERSION) .setDeviceName(DEVICE_NAME) .setCommandTimeouts(Duration.ofSeconds(240)) - .setApp(TEST_APP_ZIP) + .setApp(new URL(IOS_SIM_VODQA_RELEASE_URL)) .enableBiDi() .setWdaLaunchTimeout(WDA_LAUNCH_TIMEOUT); if (PREBUILT_WDA_PATH != null) { diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/BaseIOSTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/BaseIOSTest.java index 8fa488750..baee302da 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/BaseIOSTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/BaseIOSTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.AfterAll; import java.time.Duration; +import java.util.Optional; @SuppressWarnings("checkstyle:HideUtilityClassConstructor") public class BaseIOSTest { @@ -29,12 +30,10 @@ public class BaseIOSTest { protected static AppiumDriverLocalService service; protected static IOSDriver driver; protected static final int PORT = 4723; - public static final String DEVICE_NAME = System.getenv("IOS_DEVICE_NAME") != null - ? System.getenv("IOS_DEVICE_NAME") - : "iPhone 12"; - public static final String PLATFORM_VERSION = System.getenv("IOS_PLATFORM_VERSION") != null - ? System.getenv("IOS_PLATFORM_VERSION") - : "14.5"; + public static final String DEVICE_NAME = Optional.ofNullable(System.getenv("IOS_DEVICE_NAME")) + .orElse("iPhone 17"); + public static final String PLATFORM_VERSION = Optional.ofNullable(System.getenv("IOS_PLATFORM_VERSION")) + .orElse("26.0"); public static final Duration WDA_LAUNCH_TIMEOUT = Duration.ofMinutes(4); public static final Duration SERVER_START_TIMEOUT = Duration.ofMinutes(3); protected static String PREBUILT_WDA_PATH = System.getenv("PREBUILT_WDA_PATH"); diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/ClipboardTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/ClipboardTest.java index b8ed26a44..b3a58e588 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/ClipboardTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/ClipboardTest.java @@ -25,6 +25,6 @@ public class ClipboardTest extends AppIOSTest { @Test public void verifySetAndGetClipboardText() { final String text = "Happy testing"; driver.setClipboardText(text); - assertEquals(driver.getClipboardText(), text); + assertEquals(text, driver.getClipboardText()); } } diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/IOSAlertTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/IOSAlertTest.java index 7d91e596a..eea8899b5 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/IOSAlertTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/IOSAlertTest.java @@ -16,7 +16,6 @@ package io.appium.java_client.ios; -import io.appium.java_client.AppiumBy; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.MethodOrderer; @@ -35,34 +34,10 @@ @TestMethodOrder(MethodOrderer.MethodName.class) public class IOSAlertTest extends AppIOSTest { - private static final Duration ALERT_TIMEOUT = Duration.ofSeconds(5); private static final int CLICK_RETRIES = 2; - private static final String IOS_AUTOMATION_TEXT = "show alert"; - private final WebDriverWait waiter = new WebDriverWait(driver, ALERT_TIMEOUT); - private void ensureAlertPresence() { - int retry = 0; - // CI might not be performant enough, so we need to retry - while (true) { - try { - driver.findElement(AppiumBy.accessibilityId(IOS_AUTOMATION_TEXT)).click(); - } catch (WebDriverException e) { - // ignore - } - try { - waiter.until(alertIsPresent()); - return; - } catch (TimeoutException e) { - retry++; - if (retry >= CLICK_RETRIES) { - throw e; - } - } - } - } - @AfterEach public void afterEach() { try { @@ -97,4 +72,26 @@ public void getAlertTextTest() { ensureAlertPresence(); assertFalse(StringUtils.isBlank(driver.switchTo().alert().getText())); } + + private void ensureAlertPresence() { + int retry = 0; + // CI might not be performant enough, so we need to retry + while (true) { + try { + driver.findElement(PASSWORD_EDIT_PREDICATE).sendKeys("foo"); + driver.findElement(LOGIN_LINK_ID).click(); + } catch (WebDriverException e) { + // ignore + } + try { + waiter.until(alertIsPresent()); + return; + } catch (TimeoutException e) { + retry++; + if (retry >= CLICK_RETRIES) { + throw e; + } + } + } + } } From 0d29dde2966fea5250b2510376ebaec8f76e0d95 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Mon, 20 Oct 2025 15:09:19 +0200 Subject: [PATCH 2/2] moar --- .../io/appium/java_client/ios/AppIOSTest.java | 22 ++++ .../java_client/ios/IOSAppStringsTest.java | 36 ------ .../appium/java_client/ios/IOSDriverTest.java | 36 +----- .../java_client/ios/IOSElementTest.java | 51 ++++---- .../java_client/ios/IOSSearchingTest.java | 32 ++--- .../pagefactory_tests/XCUITModeTest.java | 115 ++++++++---------- src/e2eIosTest/resources/TestApp.app.zip | Bin 32587 -> 0 bytes .../appium/java_client/utils/TestUtils.java | 16 +++ 8 files changed, 127 insertions(+), 181 deletions(-) delete mode 100644 src/e2eIosTest/java/io/appium/java_client/ios/IOSAppStringsTest.java delete mode 100644 src/e2eIosTest/resources/TestApp.app.zip diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java index 0ef5806fe..58461127b 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/AppIOSTest.java @@ -1,3 +1,19 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package io.appium.java_client.ios; import io.appium.java_client.ios.options.XCUITestOptions; @@ -10,13 +26,19 @@ import java.time.Duration; import static io.appium.java_client.AppiumBy.accessibilityId; +import static io.appium.java_client.AppiumBy.iOSClassChain; import static io.appium.java_client.AppiumBy.iOSNsPredicateString; import static io.appium.java_client.utils.TestUtils.IOS_SIM_VODQA_RELEASE_URL; public class AppIOSTest extends BaseIOSTest { protected static final String BUNDLE_ID = "org.reactjs.native.example.VodQAReactNative"; protected static final By LOGIN_LINK_ID = accessibilityId("login"); + protected static final By USERNAME_EDIT_PREDICATE = iOSNsPredicateString("name == \"username\""); protected static final By PASSWORD_EDIT_PREDICATE = iOSNsPredicateString("name == \"password\""); + protected static final By SLIDER_MENU_ITEM_PREDICATE = iOSNsPredicateString("name == \"slider1\""); + protected static final By VODQA_LOGO_CLASS_CHAIN = iOSClassChain( + "**/XCUIElementTypeImage[`name CONTAINS \"vodqa\"`]" + ); @BeforeAll public static void beforeClass() throws MalformedURLException { diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/IOSAppStringsTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/IOSAppStringsTest.java deleted file mode 100644 index dc552dc91..000000000 --- a/src/e2eIosTest/java/io/appium/java_client/ios/IOSAppStringsTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * See the NOTICE file distributed with this work for additional - * information regarding copyright ownership. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.appium.java_client.ios; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -public class IOSAppStringsTest extends AppIOSTest { - - @Test public void getAppStrings() { - assertNotEquals(0, driver.getAppStringMap().size()); - } - - @Test public void getGetAppStringsUsingLang() { - assertNotEquals(0, driver.getAppStringMap("en").size()); - } - - @Test public void getAppStringsUsingLangAndFileStrings() { - assertNotEquals(0, driver.getAppStringMap("en", "Localizable.strings").size()); - } -} diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/IOSDriverTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/IOSDriverTest.java index aa0a66f2a..097e852f9 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/IOSDriverTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/IOSDriverTest.java @@ -21,9 +21,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.openqa.selenium.By; import org.openqa.selenium.ScreenOrientation; -import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebElement; import org.openqa.selenium.remote.Response; import org.openqa.selenium.remote.http.HttpMethod; @@ -65,13 +63,12 @@ public void addCustomCommandWithSessionIdTest() { @Test public void addCustomCommandWithElementIdTest() { - WebElement intA = driver.findElement(By.id("IntegerA")); - intA.clear(); + var usernameEdit = driver.findElement(USERNAME_EDIT_PREDICATE); driver.addCommand(HttpMethod.POST, String.format("/session/%s/appium/element/%s/value", driver.getSessionId(), - ((RemoteWebElement) intA).getId()), "setNewValue"); + ((RemoteWebElement) usernameEdit).getId()), "setNewValue"); final Response setNewValue = driver.execute("setNewValue", - Map.of("id", ((RemoteWebElement) intA).getId(), "text", "8")); + Map.of("id", ((RemoteWebElement) usernameEdit).getId(), "text", "foo")); assertNotNull(setNewValue.getSessionId()); } @@ -114,17 +111,15 @@ public void getDeviceTimeTest() { } @Test public void pullFileTest() { - byte[] data = driver.pullFile(String.format("@%s/TestApp", BUNDLE_ID)); + byte[] data = driver.pullFile(String.format("@%s/VodQAReactNative", BUNDLE_ID)); assertThat(data.length, greaterThan(0)); } @Test public void keyboardTest() { - WebElement element = driver.findElement(By.id("IntegerA")); - element.click(); + driver.findElement(USERNAME_EDIT_PREDICATE).click(); assertTrue(driver.isKeyboardShown()); } - @Disabled("The app crashes when restored from the background") @Test public void putAppIntoBackgroundAndRestoreTest() { final long msStarted = System.currentTimeMillis(); @@ -132,7 +127,6 @@ public void putAppIntoBackgroundAndRestoreTest() { assertThat(System.currentTimeMillis() - msStarted, greaterThan(3000L)); } - @Disabled("The app crashes when restored from the background") @Test public void applicationsManagementTest() { driver.runAppInBackground(Duration.ofSeconds(-1)); @@ -144,24 +138,4 @@ public void applicationsManagementTest() { () -> driver.queryAppState(BUNDLE_ID) == ApplicationState.RUNNING_IN_FOREGROUND, Duration.ofSeconds(10), Duration.ofSeconds(1)); } - - @Disabled("The app crashes when restored from the background") - @Test - public void putAIntoBackgroundWithoutRestoreTest() { - waitUntilTrue(() -> !driver.findElements(By.id("IntegerA")).isEmpty(), - Duration.ofSeconds(10), Duration.ofSeconds(1)); - driver.runAppInBackground(Duration.ofSeconds(-1)); - waitUntilTrue(() -> driver.findElements(By.id("IntegerA")).isEmpty(), - Duration.ofSeconds(10), Duration.ofSeconds(1)); - driver.activateApp(BUNDLE_ID); - } - - @Disabled - @Test public void touchIdTest() { - driver.toggleTouchIDEnrollment(true); - driver.performTouchID(true); - driver.performTouchID(false); - //noinspection SimplifiableAssertion,EqualsWithItself - assertEquals(true, true); - } } diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/IOSElementTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/IOSElementTest.java index 5d3d943a5..873155e6a 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/IOSElementTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/IOSElementTest.java @@ -1,37 +1,38 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package io.appium.java_client.ios; -import io.appium.java_client.AppiumBy; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.WebDriverWait; - -import java.time.Duration; +import org.openqa.selenium.By; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.openqa.selenium.By.className; -@TestMethodOrder(MethodOrderer.MethodName.class) public class IOSElementTest extends AppIOSTest { + private static final By SLIDER_CLASS = className("XCUIElementTypeSlider"); - @Test - public void findByAccessibilityIdTest() { - assertThat(driver.findElements(AppiumBy.accessibilityId("Compute Sum")).size(), not(is(0))); - } - - // FIXME: Stabilize the test on CI - @Disabled @Test public void setValueTest() { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); + driver.findElement(LOGIN_LINK_ID).click(); + driver.findElement(SLIDER_MENU_ITEM_PREDICATE).click(); - WebElement slider = wait.until( - driver1 -> driver1.findElement(AppiumBy.className("XCUIElementTypeSlider"))); - slider.sendKeys("0%"); - assertEquals("0%", slider.getAttribute("value")); + var slider = driver.findElement(SLIDER_CLASS); + var previousValue = slider.getAttribute("value"); + slider.sendKeys("0.5"); + assertNotEquals(slider.getAttribute("value"), previousValue); } } diff --git a/src/e2eIosTest/java/io/appium/java_client/ios/IOSSearchingTest.java b/src/e2eIosTest/java/io/appium/java_client/ios/IOSSearchingTest.java index 5af445b0b..e3fa303e6 100644 --- a/src/e2eIosTest/java/io/appium/java_client/ios/IOSSearchingTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/ios/IOSSearchingTest.java @@ -16,37 +16,25 @@ package io.appium.java_client.ios; -import io.appium.java_client.AppiumBy; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class IOSSearchingTest extends AppIOSTest { - - @Test public void findByAccessibilityIdTest() { - assertNotEquals(driver - .findElement(AppiumBy.accessibilityId("ComputeSumButton")) - .getText(), null); - assertNotEquals(driver - .findElements(AppiumBy.accessibilityId("ComputeSumButton")) - .size(), 0); + @Test + public void findByAccessibilityIdTest() { + assertNotNull(driver.findElement(LOGIN_LINK_ID).getText()); + assertNotEquals(0, driver.findElements(LOGIN_LINK_ID).size()); } - @Test public void findByByIosPredicatesTest() { - assertNotEquals(driver - .findElement(AppiumBy.iOSNsPredicateString("name like 'Answer'")) - .getText(), null); - assertNotEquals(driver - .findElements(AppiumBy.iOSNsPredicateString("name like 'Answer'")) - .size(), 0); + @Test + public void findByByIosPredicatesTest() { + assertNotNull(driver.findElement(USERNAME_EDIT_PREDICATE).getText()); + assertNotEquals(0, driver.findElements(USERNAME_EDIT_PREDICATE).size()); } @Test public void findByByIosClassChainTest() { - assertNotEquals(driver - .findElement(AppiumBy.iOSClassChain("**/XCUIElementTypeButton")) - .getText(), null); - assertNotEquals(driver - .findElements(AppiumBy.iOSClassChain("**/XCUIElementTypeButton")) - .size(), 0); + assertNotEquals(0, driver.findElements(VODQA_LOGO_CLASS_CHAIN).size()); } } diff --git a/src/e2eIosTest/java/io/appium/java_client/pagefactory_tests/XCUITModeTest.java b/src/e2eIosTest/java/io/appium/java_client/pagefactory_tests/XCUITModeTest.java index 9660da6a4..7d89bd331 100644 --- a/src/e2eIosTest/java/io/appium/java_client/pagefactory_tests/XCUITModeTest.java +++ b/src/e2eIosTest/java/io/appium/java_client/pagefactory_tests/XCUITModeTest.java @@ -32,12 +32,8 @@ import static io.appium.java_client.pagefactory.LocatorGroupStrategy.ALL_POSSIBLE; import static io.appium.java_client.pagefactory.LocatorGroupStrategy.CHAIN; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @TestMethodOrder(MethodOrderer.MethodName.class) @@ -46,52 +42,40 @@ public class XCUITModeTest extends AppIOSTest { private boolean populated = false; @HowToUseLocators(iOSXCUITAutomation = ALL_POSSIBLE) - @iOSXCUITFindBy(iOSNsPredicate = "label contains 'Compute'") - @iOSXCUITFindBy(className = "XCUIElementTypeButton") - private WebElement computeButton; + @iOSXCUITFindBy(iOSNsPredicate = "name == \"assets/assets/vodqa.png\"") + @iOSXCUITFindBy(className = "XCUIElementTypeImage") + private WebElement logoImageAllPossible; @HowToUseLocators(iOSXCUITAutomation = CHAIN) - @iOSXCUITFindBy(iOSNsPredicate = "name like 'Answer'") - private WebElement answer; + @iOSXCUITFindBy(iOSNsPredicate = "name CONTAINS 'vodqa'") + private WebElement logoImageChain; - @iOSXCUITFindBy(iOSNsPredicate = "name = 'IntegerA'") - private WebElement textField1; + @iOSXCUITFindBy(iOSNsPredicate = "name == 'username'") + private WebElement usernameFieldPredicate; - @HowToUseLocators(iOSXCUITAutomation = ALL_POSSIBLE) - @iOSXCUITFindBy(iOSNsPredicate = "name = 'IntegerB'") - @iOSXCUITFindBy(accessibility = "IntegerB") - private WebElement textField2; - - @iOSXCUITFindBy(iOSNsPredicate = "name ENDSWITH 'Gesture'") - private WebElement gesture; - - @iOSXCUITFindBy(className = "XCUIElementTypeSlider") - private WebElement slider; + @iOSXCUITFindBy(iOSNsPredicate = "name ENDSWITH '.png'") + private WebElement logoImagePredicate; - @iOSXCUITFindBy(id = "locationStatus") - private WebElement locationStatus; - - @HowToUseLocators(iOSXCUITAutomation = CHAIN) - @iOSXCUITFindBy(iOSNsPredicate = "name BEGINSWITH 'contact'") - private WebElement contactAlert; + @iOSXCUITFindBy(className = "XCUIElementTypeImage") + private WebElement logoImageClass; - @HowToUseLocators(iOSXCUITAutomation = ALL_POSSIBLE) - @iOSXCUITFindBy(iOSNsPredicate = "name BEGINSWITH 'location'") - private WebElement locationAlert; + @iOSXCUITFindBy(accessibility = "login") + private WebElement loginLinkAccId; - @iOSXCUITFindBy(iOSClassChain = "XCUIElementTypeWindow/*/XCUIElementTypeTextField[2]") - private WebElement secondTextField; + @iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeTextField[`name == \"username\"`]") + private WebElement usernameFieldClassChain; - @iOSXCUITFindBy(iOSClassChain = "XCUIElementTypeWindow/*/XCUIElementTypeButton[-1]") - private WebElement lastButton; + @iOSXCUITFindBy(iOSClassChain = "**/XCUIElementTypeSecureTextField[`name == \"password\"`][-1]") + private WebElement passwordFieldClassChain; - @iOSXCUITFindBy(iOSClassChain = "XCUIElementTypeWindow/*/XCUIElementTypeButton") - private List allButtons; + @iOSXCUITFindBy(iOSClassChain = "**/*[`type CONTAINS \"TextField\"`]") + private List allTextFields; /** * The setting up. */ - @BeforeEach public void setUp() { + @BeforeEach + public void setUp() { if (!populated) { PageFactory.initElements(new AppiumFieldDecorator(driver), this); } @@ -99,51 +83,48 @@ public class XCUITModeTest extends AppIOSTest { populated = true; } - @Test public void findByXCUITSelectorTest() { - assertNotEquals(null, computeButton.getText()); - } - - @Test public void findElementByNameTest() { - assertEquals("TextField1", textField1.getText()); - } - - @Test public void findElementByClassNameTest() { - assertEquals("50%", slider.getAttribute("value")); + @Test + public void findByXCUITSelectorTest() { + assertTrue(logoImageAllPossible.isDisplayed()); } - @Test public void pageObjectChainingTest() { - assertTrue(contactAlert.isDisplayed()); + @Test + public void findElementByNameTest() { + assertTrue(usernameFieldPredicate.isDisplayed()); } - @Test public void findElementByIdTest() { - assertTrue(locationStatus.isDisplayed()); + @Test + public void findElementByClassNameTest() { + assertTrue(logoImageClass.isDisplayed()); } - @Test public void nativeSelectorTest() { - assertTrue(locationAlert.isDisplayed()); + @Test + public void pageObjectChainingTest() { + assertTrue(logoImageChain.isDisplayed()); } - @Test public void findElementByClassChain() { - assertThat(secondTextField.getAttribute("name"), equalTo("IntegerB")); + @Test + public void findElementByIdTest() { + assertTrue(loginLinkAccId.isDisplayed()); } - @Test public void findElementByClassChainWithNegativeIndex() { - assertThat(lastButton.getAttribute("name"), equalTo("Check calendar authorized")); + @Test + public void nativeSelectorTest() { + assertTrue(logoImagePredicate.isDisplayed()); } - @Test public void findMultipleElementsByClassChain() { - assertThat(allButtons.size(), is(greaterThan(1))); + @Test + public void findElementByClassChain() { + assertTrue(usernameFieldClassChain.isDisplayed()); } - @Test public void findElementByXUISelectorTest() { - assertNotNull(gesture.getText()); + @Test + public void findElementByClassChainWithNegativeIndex() { + assertTrue(passwordFieldClassChain.isDisplayed()); } - @Test public void setValueTest() { - textField1.sendKeys("2"); - textField2.sendKeys("4"); - driver.hideKeyboard(); - computeButton.click(); - assertEquals("6", answer.getText()); + @Test + public void findMultipleElementsByClassChain() { + assertThat(allTextFields.size(), is(greaterThan(1))); } } diff --git a/src/e2eIosTest/resources/TestApp.app.zip b/src/e2eIosTest/resources/TestApp.app.zip deleted file mode 100644 index 9bce3578111bc8dcec808524122bc75ba4efa4dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32587 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 p6>LBB+rNSRKilWe{`=2(;x9C=