How to use iOSNsPredicateString method of io.appium.java_client.MobileBy class

Best io.appium code snippet using io.appium.java_client.MobileBy.iOSNsPredicateString

ActionsClass.java

Source:ActionsClass.java Github

copy

Full Screen

...32                return Base.driver.findElement(MobileBy.xpath(arry[1]));33            case "className":34                return Base.driver.findElement(MobileBy.className(arry[1]));35            case "iOSNsPredicate":36                return Base.driver.findElement(MobileBy.iOSNsPredicateString(arry[1]));37            case "iOSClassChain":38                return Base.driver.findElement(MobileBy.iOSClassChain(arry[1]));39            default:40                return Base.driver.findElement(MobileBy.AccessibilityId(arry[1]));41        }42    }43    public static boolean click(String str_Element) {44        try {45            String[] str_Arr = getObjectDetails(str_Element);46            fetchElement(str_Arr).click();47            System.out.println("Clicked on " + str_Element);48            return true;49        } catch (Exception e) {50            isPresent(str_Element);51            System.out.println("Error while clicking on " + str_Element);52            System.out.println("The error message is:\n" + e.getMessage());53        }54        return false;55    }56    public static boolean enter(String str_Text,String str_Element) {57        try {58            String[] str_Arr = getObjectDetails(str_Element);59            fetchElement(str_Arr).clear();60            fetchElement(str_Arr).sendKeys(str_Text);61            System.out.println("send text " + str_Text);62            return true;63        } catch (Exception e) {64            isPresent(str_Element);65            System.out.println("Error while sending on " + str_Element);66            System.out.println("The error message is:\n" + e.getMessage());67        }68        return false;69    }70    public static boolean isPresent(String str_Element) {71        try {72            String[] str_Arr = getObjectDetails(str_Element);73            if (fetchElements(str_Arr).size() > 0) {74                if (fetchElement(str_Arr).isDisplayed() && fetchElement(str_Arr).isEnabled()) {75                    System.out.println(str_Element + " is present");76                    return true;77                } else {78                    System.out.println(str_Element + " is not present or disabled");79                }80            } else {81                System.out.println(str_Element + " is not present or disabled");82            }83        } catch (Exception e) {84            System.out.println("Error while checking presence of " + str_Element);85            System.out.println("The error message is:\n" + e.getMessage());86        }87        return false;88    }89    public static boolean isPresent(String arg1, By by) {90        try {91            if (Base.driver.findElement(by).isEnabled()) {92                System.out.println(arg1 + " is present");93                return true;94            } else {95                System.out.println(arg1 + " is not present");96            }97        } catch (Exception e) {98            System.out.println("Error while checking presence of " + arg1);99            System.out.println("The error message is:\n" + e.getMessage());100        }101        return false;102    }103    public static boolean isEnabled(String str_Element) {104        try {105            String[] str_Arr = getObjectDetails(str_Element);106            if (fetchElements(str_Arr).size() > 0) {107                if (fetchElement(str_Arr).isEnabled()) {108                    System.out.println(str_Element + " is Enabled");109                    return true;110                } else {111                    System.out.println(str_Element + " is not present or disabled");112                }113            } else {114                System.out.println(str_Element + " is not present or disabled");115            }116        } catch (Exception e) {117            System.out.println("Error while checking Enable of " + str_Element);118            System.out.println("The error message is:\n" + e.getMessage());119        }120        return false;121    }122    public static List<MobileElement> fetchElements(String[] arry) {123        switch (arry[0]) {124            case "xpath":125                return Base.driver.findElements(MobileBy.xpath(arry[1]));126            case "className":127                return Base.driver.findElements(MobileBy.className(arry[1]));128            case "iOSNsPredicate":129                return Base.driver.findElements(MobileBy.iOSNsPredicateString(arry[1]));130            case "iOSClassChain":131                return Base.driver.findElements(MobileBy.iOSClassChain(arry[1]));132            default:133                return Base.driver.findElements(MobileBy.AccessibilityId(arry[1]));134        }135    }136    public static By getLocator(String[] arry) {137        //System.out.println("we are inside getLocators method");138        switch (arry[0]) {139            case "xpath":140                return MobileBy.xpath(arry[1]);141            case "className":142                return MobileBy.className(arry[1]);143            case "iOSNsPredicate":144                return MobileBy.iOSNsPredicateString(arry[1]);145            case "iOSClassChain":146                return MobileBy.iOSClassChain(arry[1]);147            case "UIAutomatorSelector":148                return MobileBy.AndroidUIAutomator(arry[1]);149            case "id":150                return MobileBy.id(arry[1]);151            default:152                return MobileBy.AccessibilityId(arry[1]);153        }154    }155    public static MobileElement fetchElement(String[] arry) {156        switch (arry[0]) {157            case "xpath":158                return Base.driver.findElement(MobileBy.xpath(arry[1]));159            case "className":160                return Base.driver.findElement(MobileBy.className(arry[1]));161            case "iOSNsPredicate":162                return Base.driver.findElement(MobileBy.iOSNsPredicateString(arry[1]));163            case "iOSClassChain":164                return Base.driver.findElement(MobileBy.iOSClassChain(arry[1]));165            case "UIAutomatorSelector":166                return Base.driver.findElement(MobileBy.AndroidUIAutomator(arry[1]));167            case "id":168                return Base.driver.findElement(MobileBy.id(arry[1]));169            default:170                return Base.driver.findElement(MobileBy.AccessibilityId(arry[1]));171        }172    }173    public static boolean scrollToText(String strTextToScroll) {174        System.out.println("We will scroll to text:" + strTextToScroll);175        String strCriteria = "";176//        By byCriteria = null;...

Full Screen

Full Screen

IOSLocator.java

Source:IOSLocator.java Github

copy

Full Screen

...85	86	/**87	 * 封装 AppLocator.getLocator 方法,使用 iOSNsPredicate 方式,查找单一元素88	 * 89	 * @param iOSNsPredicateString iOSNsPredicate的谓词信息90	 * 91	 * @return MyElement {@link MyElement}92	 * 93	 */94	public MyElement getLocatorByIOSNsPredicate(String iOSNsPredicateString) {95		return super.getLocator(MobileBy.iOSNsPredicateString(iOSNsPredicateString));96	}97	98	/**99	 * 封装 AppLocator.getLocators 方法,使用 iOSNsPredicate 方式,查找元素集合100	 * 101	 * @param iOSNsPredicateString iOSNsPredicate的谓词信息102	 * 103	 * @return MyElement {@link MyElement}104	 * 105	 */106	public List<MyElement> getLocatorsByIOSNsPredicate(String iOSNsPredicateString) {107		return super.getLocators(MobileBy.iOSNsPredicateString(iOSNsPredicateString));108	}109	110	/**111	 * 封装 AppLocator.getLocator 方法,使用 iOSClassChain 方式,查找单一元素112	 * 113	 * @param iOSClassChainString iOSClassChain的谓词信息114	 * 115	 * @return MyElement {@link MyElement}116	 * 117	 */118	public MyElement getLocatorByIOSClassChain(String iOSClassChainString) {119		return super.getLocator(MobileBy.iOSClassChain(iOSClassChainString));120	}121	...

Full Screen

Full Screen

IOSCalendarTest.java

Source:IOSCalendarTest.java Github

copy

Full Screen

...27    }28    @Test29    public void createEvent() {30        driver.findElement(MobileBy.iOSClassChain("**/XCUIElementTypeButton[`label == 'Today'`]")).click();31        driver.findElement(MobileBy.iOSNsPredicateString("label == 'Add'")).click();32        driver.findElement(MobileBy.iOSNsPredicateString("name == 'Title'")).sendKeys(testEvent.getEventName());33        //enter start date34        driver.findElement(MobileBy.iOSClassChain("**/XCUIElementTypeOther[`label == 'Date and Time Picker'`][1]/XCUIElementTypeButton[2]")).click();35        List<MobileElement> wheelsStart = driver.findElements(MobileBy.iOSClassChain("**/XCUIElementTypePickerWheel"));36        wheelsStart.get(0).sendKeys(testEvent.getStartHours());37        wheelsStart.get(1).sendKeys(testEvent.getIosStartMin());38        wheelsStart.get(2).sendKeys(testEvent.getStartDayTime());39        //enter end date40        driver.findElement(MobileBy.iOSClassChain("**/XCUIElementTypeOther[`label == 'Date and Time Picker'`][2]/XCUIElementTypeButton[2]")).click();41        List<MobileElement> wheelsEnd = driver.findElements(MobileBy.iOSClassChain("**/XCUIElementTypePickerWheel"));42        wheelsEnd.get(0).sendKeys(testEvent.getEndHours());43        wheelsEnd.get(1).sendKeys(testEvent.getIosEndMin());44        wheelsEnd.get(2).sendKeys(testEvent.getEndDayTime());45        driver.findElement(MobileBy.iOSNsPredicateString("label == 'Add' AND visible == 1")).click();46        //validation47        Assert.assertTrue("The event is missed in the list of events", !driver.findElements(MobileBy.iOSClassChain(String.format("**/XCUIElementTypeButton[`name CONTAINS[cd] '%s'`]", testEvent.getEventName()))).isEmpty());48        String expectedDetails = driver.findElement(MobileBy.iOSClassChain(String.format("**/XCUIElementTypeButton[`name CONTAINS[cd] '%s'`]", testEvent.getEventName()))).getText();49        String actualDetails = testEvent.getIosEventDetails();50        Assert.assertEquals("Expected event details don't match to actual ones", expectedDetails, actualDetails);51    }52    @After53    public void deleteEvent() {54        driver.closeApp();55        driver.launchApp();56        if (!driver.findElements(MobileBy.iOSClassChain(String.format("**/XCUIElementTypeButton[`name CONTAINS[cd] '%s'`]", testEvent.getEventName()))).isEmpty()) {57            HashMap<String, String> scrollObject = new HashMap<>();58            scrollObject.put("direction", "up");59            scrollObject.put("index", "13");60            driver.executeScript("mobile: swipe", scrollObject);61            driver.findElement(MobileBy.iOSClassChain(String.format("**/XCUIElementTypeButton[`name CONTAINS[cd] '%s'`]", testEvent.getEventName()))).click();62            driver.findElement(MobileBy.iOSNsPredicateString("value == 'Delete Event'")).click();63            driver.findElement(MobileBy.iOSNsPredicateString("label == 'Delete Event' AND visible = 1")).click();64        }65    }66    @After67    public void driverTearDown() {68        driver.quit();69    }70}...

Full Screen

Full Screen

ProductPage.java

Source:ProductPage.java Github

copy

Full Screen

...8import org.testng.Assert;9public class ProductPage extends WebActions {10    public AppiumDriver<?> driver;11    WebDriverWait wait;12    By product1 = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND name == 'test-Item title' AND label == 'Sauce Labs Backpack'");13    By addToCartBtn = MobileBy.AccessibilityId("test-ADD TO CART");14    By productPrice = MobileBy.AccessibilityId("test-Price");15    By backToProductsBtn = MobileBy.AccessibilityId("test-BACK TO PRODUCTS");16    By removeBtn = MobileBy.AccessibilityId("test-REMOVE");17    By cartbtn = MobileBy.xpath("(//XCUIElementTypeOther[@name='1'])[4]");18    By cartHeader = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND label == 'YOUR CART'");19    By checkoutBtn = MobileBy.AccessibilityId("test-CHECKOUT");20    By productLabel = MobileBy.AccessibilityId("Sauce Labs Backpack");21    By checkoutHeader = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND label == 'CHECKOUT: INFORMATION'");22    By firstName = MobileBy.AccessibilityId("test-First Name");23    By lastName = MobileBy.AccessibilityId("test-Last Name");24    By zipCode = MobileBy.AccessibilityId("test-Zip/Postal Code");25    By checkoutContinue = MobileBy.AccessibilityId("test-CONTINUE");26    By overviewHeader = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND label == 'CHECKOUT: OVERVIEW'");27    By finishBtn = MobileBy.AccessibilityId("test-FINISH");28    By completeHeader = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND label == 'CHECKOUT: COMPLETE!'");29    By completeMsg = MobileBy.AccessibilityId("THANK YOU FOR YOU ORDER");30    By backHomeBtn = MobileBy.AccessibilityId("test-BACK HOME");31    public ProductPage(AppiumDriver<?> driver) {32        this.driver = driver;33        this.wait = new WebDriverWait(driver, 10);34    }35    public void checkoutProduct(String firstName_, String lastName_, String zip_) {36        isDisplayed(product1);37        click(product1);38        wait(backToProductsBtn);39        logScreenshot("PDP Page");40        isDisplayed(productPrice);41        isDisplayed(productLabel);42        click(addToCartBtn);...

Full Screen

Full Screen

LoginPage.java

Source:LoginPage.java Github

copy

Full Screen

...11    WebDriverWait wait;12    By username_txt = MobileBy.AccessibilityId("test-Username");13    By password_txt = MobileBy.AccessibilityId("test-Password");14    By loginBtn = MobileBy.AccessibilityId("test-LOGIN");15    By productsHeader = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText' AND label == 'PRODUCTS'");16    By menu = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeOther' AND name == 'test-Menu'");17    By menu_header = MobileBy.AccessibilityId("test-ALL ITEMS");18    By logoutBtn = MobileBy.AccessibilityId("test-LOGOUT");19    By login_page = MobileBy.AccessibilityId("Username Password LOGIN");20    By invalidLoginMsg = MobileBy.AccessibilityId("Username and password do not match any user in this service.");21    public LoginPage(AppiumDriver<?> driver) {22        this.driver = driver;23        this.wait = new WebDriverWait(driver, 10);24    }25    public void login(String user_name, String password) {26        driver.findElement(username_txt).sendKeys(user_name);27        driver.findElement(password_txt).sendKeys(password);28        logScreenshot("login");29        driver.findElement(loginBtn).click();30    }...

Full Screen

Full Screen

DeepLink.java

Source:DeepLink.java Github

copy

Full Screen

...17                deepUrl.put("package", "com.swaglabsmobileapp");18                driver.executeScript("mobile: deepLink", deepUrl);19                break;20            case "ios":21                By urlBtn = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' && name CONTAINS 'URL'");22                By urlFld = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeTextField' && name CONTAINS 'URL'");23                By openBtn = MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' && name CONTAINS 'Open'");24                driver.activateApp("com.apple.mobilesafari");25                WebDriverWait wait = new WebDriverWait(driver, 10);26                wait.until(ExpectedConditions.visibilityOfElementLocated(urlBtn)).click();27                wait.until(ExpectedConditions.visibilityOfElementLocated(urlFld)).sendKeys("" + url + "\uE007");28                wait.until(ExpectedConditions.visibilityOfElementLocated(openBtn)).click();29                break;30        }31    }32}...

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1import java.net.MalformedURLException;2import java.net.URL;3import java.util.concurrent.TimeUnit;4import org.openqa.selenium.WebElement;5import org.openqa.selenium.remote.DesiredCapabilities;6import io.appium.java_client.AppiumDriver;7import io.appium.java_client.MobileBy;8import io.appium.java_client.MobileElement;9import io.appium.java_client.ios.IOSDriver;10public class iOSNsPredicateString {11 public static void main(String[] args) throws MalformedURLException, InterruptedException {12  DesiredCapabilities cap = new DesiredCapabilities();13  cap.setCapability("deviceName", "iPhone 6");14  cap.setCapability("platformName", "iOS");15  cap.setCapability("platformVersion", "12.1");16  cap.setCapability("automationName", "XCUITest");17  cap.setCapability("app", "/Users/rahul/Library/Developer/Xcode/DerivedData/Calculator-dtjyqjyqzvzvqogjzjgdxhgqzjol/Build/Products/Debug-iphonesimulator/Calculator.app");

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1import org.openqa.selenium.WebElement;2import org.openqa.selenium.support.ui.ExpectedConditions;3import org.openqa.selenium.support.ui.WebDriverWait;4import io.appium.java_client.MobileBy;5import io.appium.java_client.ios.IOSDriver;6import io.appium.java_client.remote.MobileCapabilityType;7import java.net.URL;8import java.net.MalformedURLException;9import java.util.concurrent.TimeUnit;10import org.openqa.selenium.remote.DesiredCapabilities;11import org.testng.annotations.Test;12import org.testng.annotations.BeforeClass;13import org.testng.annotations.AfterClass;14public class iOSNsPredicateString {15    private String reportDirectory = "reports";16    private String reportFormat = "xml";17    private String testName = "Untitled";18    protected IOSDriver<WebElement> driver = null;19    DesiredCapabilities dc = new DesiredCapabilities();20    public void setUp() throws MalformedURLException {21        dc.setCapability("reportDirectory", reportDirectory);22        dc.setCapability("reportFormat", reportFormat);23        dc.setCapability("testName", testName);24        dc.setCapability(MobileCapabilityType.UDID, "c8a8a2a2a9c9d1c1a0e8d3e3b3a3b0c0a8d8e1c1");25        dc.setCapability(IOSMobileCapabilityType.BUNDLE_ID, "com.experitest.ExperiBank");26        driver.setLogLevel(Level.INFO);27    }28    public void testUntitled() {29        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(MobileBy.iOSNsPredicateString("name == 'usernameTextField'")));30        driver.findElement(MobileBy.iOSNsPredicateString("name == 'usernameTextField'")).sendKeys("company");31        driver.findElement(MobileBy.iOSNsPredicateString("name == 'passwordTextField'")).sendKeys("company");32        driver.findElement(MobileBy.iOSNsPredicateString("name == 'loginButton'")).click();33        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(MobileBy.iOSNsPredicateString("name == 'makePaymentButton'")));34        driver.findElement(MobileBy.iOSNsPredicateString("name == 'makePaymentButton'")).click();35        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(MobileBy.iOSNsPredicateString("name == 'phoneTextField'")));

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1MobileBy iOSNsPredicateString(String predicateString)2MobileBy iOSClassChain(String classChain)3MobileBy iOSUIAutomation(String UIAutomation)4MobileBy iOSNsPredicateString(String predicateString)5MobileBy iOSClassChain(String classChain)6MobileBy iOSUIAutomation(String UIAutomation)7MobileBy iOSNsPredicateString(String predicateString)8MobileBy iOSClassChain(String classChain)9MobileBy iOSUIAutomation(String UIAutomation)10MobileBy iOSNsPredicateString(String predicateString)11MobileBy iOSClassChain(String classChain)12MobileBy iOSUIAutomation(String UIAutomation)13MobileBy iOSNsPredicateString(String predicateString)14MobileBy iOSClassChain(String classChain)15MobileBy iOSUIAutomation(String UIAutomation)

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1MobileElement element = driver.findElement(MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND name == 'Back'"));2element.click();3MobileElement element = driver.findElement(MobileBy.iOSClassChain("**/XCUIElementTypeButton[`name == 'Back'`][1]"));4element.click();5MobileElement element = driver.findElement(MobileBy.iOSUIAutomation(".elements().withName('Back').firstWithPredicate()");6element.click();7MobileElement element = driver.findElement(MobileBy.androidUIAutomator("new UiSelector().text(\"Back\")"));8element.click();9MobileElement element = driver.findElement(MobileBy.androidDataMatcher("new UiSelector().text(\"Back\")"));10element.click();11MobileElement element = driver.findElement(MobileBy.androidViewTag("Back"));12element.click();13MobileElement element = driver.findElement(MobileBy.androidViewMatcher("Back"));14element.click();15MobileElement element = driver.findElement(MobileBy.androidViewAccessibilityId("Back"));16element.click();17MobileElement element = driver.findElement(MobileBy.androidViewContentDesc("Back"));18element.click();19MobileElement element = driver.findElement(MobileBy.androidViewId("Back"));20element.click();21MobileElement element = driver.findElement(MobileBy.androidViewText("Back"));22element.click();23MobileElement element = driver.findElement(MobileBy.androidViewXpath("Back"));24element.click();25MobileElement element = driver.findElement(M

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1MobileElement element = driver.findElement(MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND name == 'Back'"));2element.click();3element = self.driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND name == 'Back'")4element.click()5element = await driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'Back'");6await element.click();7$element = $this->driver->findElement(WebDriverBy::iosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'Back'"));8$element->click();9const element = await driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'Back'");10await element.click();11var element = driver.FindElementByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'Back'");12element.Click();13element := driver.FindElementByIosNsPredicate("type == 'XC

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1package appium.java;2import io.appium.java_client.MobileBy;3import io.appium.java_client.ios.IOSDriver;4import io.appium.java_client.remote.MobileCapabilityType;5import java.io.File;6import java.net.MalformedURLException;7import java.net.URL;8import org.openqa.selenium.remote.DesiredCapabilities;9public class iOSNsPredicateString {10    public static void main(String[] args) throws MalformedURLException, InterruptedException {11        File appDir = new File("src");12        File app = new File(appDir, "UICatalog.app");13        DesiredCapabilities capabilities = new DesiredCapabilities();14        capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");15        capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");16        capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());

Full Screen

Full Screen

iOSNsPredicateString

Using AI Code Generation

copy

Full Screen

1public class iOSNsPredicateString {2    public static void main(String[] args) throws MalformedURLException {3        DesiredCapabilities capabilities = new DesiredCapabilities();4        capabilities.setCapability("platformName", "iOS");5        capabilities.setCapability("platformVersion", "8.1");6        capabilities.setCapability("deviceName", "iPhone Simulator");7        capabilities.setCapability("app", "/Users/username/Library/Developer/Xcode/DerivedData/UICatalog-eqegntjvzgjzgkczwzvqyjzgqkxx/Build/Products/Debug-iphonesimulator/UICatalog.app");8        capabilities.setCapability("automationName", "XCUITest");9        capabilities.setCapability("browserName", "");10        capabilities.setCapability("autoAcceptAlerts", true);11        capabilities.setCapability("autoDismissAlerts", true);

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run io.appium automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful