How to use MobileBy.ByIosNsPredicate class of io.appium.java_client package

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

SmartAnnotations.java

Source:SmartAnnotations.java Github

copy

Full Screen

1package net.serenitybdd.core.annotations.locators;2import io.appium.java_client.MobileBy;3import io.appium.java_client.pagefactory.*;4import net.serenitybdd.core.annotations.findby.By;5import net.serenitybdd.core.annotations.findby.FindBy;6import net.serenitybdd.core.annotations.findby.How;7import net.serenitybdd.core.annotations.findby.di.CustomFindByAnnotationProviderService;8import net.serenitybdd.core.di.WebDriverInjectors;9import net.thucydides.core.webdriver.MobilePlatform;10import org.openqa.selenium.support.ByIdOrName;11import org.openqa.selenium.support.FindBys;12import org.openqa.selenium.support.pagefactory.Annotations;13import org.openqa.selenium.support.pagefactory.ByChained;14import java.lang.annotation.Annotation;15import java.lang.reflect.Constructor;16import java.lang.reflect.Field;17import java.lang.reflect.InvocationTargetException;18import java.lang.reflect.Method;19import java.util.*;20import static io.appium.java_client.remote.MobilePlatform.ANDROID;21import static io.appium.java_client.remote.MobilePlatform.IOS;22import static org.apache.commons.lang3.StringUtils.isNotEmpty;23public class SmartAnnotations extends Annotations {24 private Field field;25 private MobilePlatform platform;26 private CustomFindByAnnotationProviderService customFindByAnnotationProviderService;27 private final static Class<?>[] DEFAULT_ANNOTATION_METHOD_ARGUMENTS = new Class<?>[]{};28 private enum Strategies {29 BYUIAUTOMATOR("uiAutomator") {30 @Override31 org.openqa.selenium.By getBy(Annotation annotation) {32 String value = getValue(annotation, this);33 if (annotation.annotationType().equals(AndroidFindBy.class)) {34 return MobileBy.AndroidUIAutomator(value);35 }36// if (annotation.annotationType().equals(iOSXCUITFindBy.class)) {37// return MobileBy.IosUIAutomation(value);38// }39 return super.getBy(annotation);40 }41 },42 BYACCESSABILITY("accessibility") {43 @Override44 org.openqa.selenium.By getBy(Annotation annotation) {45 return MobileBy.AccessibilityId(getValue(annotation, this));46 }47 },48 BYCLASSNAME("className") {49 @Override50 org.openqa.selenium.By getBy(Annotation annotation) {51 return By.className(getValue(annotation, this));52 }53 },54 BYID("id") {55 @Override56 org.openqa.selenium.By getBy(Annotation annotation) {57 return By.id(getValue(annotation, this));58 }59 },60 BYTAG("tagName") {61 @Override62 org.openqa.selenium.By getBy(Annotation annotation) {63 return By.tagName(getValue(annotation, this));64 }65 },66 BYNAME("name") {67 @Override68 org.openqa.selenium.By getBy(Annotation annotation) {69 return By.name(getValue(annotation, this));70 }71 },72 BYXPATH("xpath") {73 @Override74 org.openqa.selenium.By getBy(Annotation annotation) {75 return By.xpath(getValue(annotation, this));76 }77 },78 BYCSS("css") {79 @Override80 org.openqa.selenium.By getBy(Annotation annotation) {81 return By.cssSelector(getValue(annotation, this));82 }83 },84 BYLINKTEXT("linkText") {85 @Override86 org.openqa.selenium.By getBy(Annotation annotation) {87 return By.linkText(getValue(annotation, this));88 }89 },90 BYPARTIALLINKTEXT("partialLinkText") {91 @Override92 org.openqa.selenium.By getBy(Annotation annotation) {93 return By.partialLinkText(getValue(annotation, this));94 }95 },96 JQUERY("jQuery") {97 @Override98 org.openqa.selenium.By getBy(Annotation annotation) {99 return By.jquery(getValue(annotation, this));100 }101 },102 SCUSING("scUsing") {103 @Override104 org.openqa.selenium.By getBy(Annotation annotation) {105 return By.sclocator(getValue(annotation, this));106 }107 },108 BYIOSCLASSCHAIN("iOSClassChain") {109 @Override110 org.openqa.selenium.By getBy(Annotation annotation) {111 return MobileBy.iOSClassChain(getValue(annotation, this));112 }113 },114 BYIOSNSPREDICATE("iOSNsPredicate") {115 @Override116 org.openqa.selenium.By getBy(Annotation annotation) {117 return MobileBy.iOSNsPredicateString(getValue(annotation, this));118 }119 };120 private final String valueName;121 private String returnValueName() {122 return valueName;123 }124 private Strategies(String valueName) {125 this.valueName = valueName;126 }127 private static String[] strategyNames() {128 Strategies[] strategies = values();129 String[] result = new String[strategies.length];130 int i = 0;131 for (Strategies strategy : values()) {132 result[i] = strategy.valueName;133 i++;134 }135 return result;136 }137 private static String getValue(Annotation annotation,138 Strategies strategy) {139 try {140 Method m = annotation.getClass().getMethod(strategy.valueName, DEFAULT_ANNOTATION_METHOD_ARGUMENTS);141 return m.invoke(annotation, new Object[]{}).toString();142 } catch (NoSuchMethodException | SecurityException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {143 throw new RuntimeException(e);144 }145 }146 org.openqa.selenium.By getBy(Annotation annotation) {147 return null;148 }149 }150 public SmartAnnotations(Field field, MobilePlatform platform) {151 this(field, platform, WebDriverInjectors.getInjector().getInstance(CustomFindByAnnotationProviderService.class));152 }153 public SmartAnnotations(Field field, MobilePlatform platform,154 CustomFindByAnnotationProviderService customFindByAnnotationProviderService) {155 super(field);156 this.field = field;157 this.platform = platform;158 this.customFindByAnnotationProviderService = customFindByAnnotationProviderService;159 }160 protected void assertValidAnnotations() {161 FindBys findBys = field.getAnnotation(FindBys.class);162 FindBy myFindBy = field.getAnnotation(FindBy.class);163 // START - [dep1] *** todo [deprecate thucydides] Remove this check once thucydides package name removed164 net.thucydides.core.annotations.findby.FindBy myDepFindBy = field.getAnnotation(net.thucydides.core.annotations.findby.FindBy.class);165 if (myDepFindBy != null && myFindBy != null) {166 throw new IllegalArgumentException(("Do not combine the serenitybdd and thucydides namespace. The thucydides namespace is now deprecated, so please convert."));167 }168 if (findBys != null && myDepFindBy != null) {169 throw new IllegalArgumentException("If you use a '@FindBys' annotation, "170 + "you must not also use a '@FindBy' annotation");171 }172 // END - [dep1] *** [deprecated thucydides]173 if (findBys != null && myFindBy != null) {174 throw new IllegalArgumentException("If you use a '@FindBys' annotation, "175 + "you must not also use a '@FindBy' annotation");176 }177 }178 // @Override179 public org.openqa.selenium.By buildBy() {180 assertValidAnnotations();181 org.openqa.selenium.By by = null;182 // appium additions183 AndroidFindBy androidBy = field.getAnnotation(AndroidFindBy.class);184 if (androidBy != null && ANDROID.toUpperCase().equals(platform.name())) {185 by = getMobileBy(androidBy, getFieldValue(androidBy));186 }187 AndroidFindBys androidBys = field.getAnnotation(AndroidFindBys.class);188 if (androidBys != null && ANDROID.toUpperCase().equals(platform.name())) {189 by = getComplexMobileBy(androidBys.value(), ByChained.class);190 }191 AndroidFindAll androidFindAll = field.getAnnotation(AndroidFindAll.class);192 if (androidFindAll != null && ANDROID.toUpperCase().equals(platform.name())) {193 by = getComplexMobileBy(androidFindAll.value(), ByChained.class);194 }195 iOSXCUITFindBy iOSBy = field.getAnnotation(iOSXCUITFindBy.class);196 if (iOSBy != null && IOS.toUpperCase().equals(platform.name())) {197 by = getMobileBy(iOSBy, getFieldValue(iOSBy));198 }199 iOSXCUITFindBys iOSBys = field.getAnnotation(iOSXCUITFindBys.class);200 if (iOSBys != null && IOS.toUpperCase().equals(platform.name())) {201 by = getComplexMobileBy(iOSBys.value(), ByChained.class);202 }203 iOSXCUITFindAll iOSXCUITFindAll = field.getAnnotation(iOSXCUITFindAll.class);204 if (iOSXCUITFindAll != null && IOS.toUpperCase().equals(platform.name())) {205 by = getComplexMobileBy(iOSXCUITFindAll.value(), ByChained.class);206 }207 //my additions to FindBy208 FindBy myFindBy = field.getAnnotation(FindBy.class);209 if (by == null && myFindBy != null) {210 by = buildByFromFindBy(myFindBy);211 }212 // START - [deo2] *** todo [deprecate thucydides] Remove this code once thucydides package name removed213 //my additions to FindBy214 net.thucydides.core.annotations.findby.FindBy myDepFindBy = field.getAnnotation(net.thucydides.core.annotations.findby.FindBy.class);215 if (by == null && myDepFindBy != null) {216 by = buildByFromFindBy(myDepFindBy);217 }218 //END - [dep2] ***219// FindBys thucydidesBys = field.getAnnotation(FindBys.class);220// if (thucydidesBys != null) {221// by = buildByFromFindBys(thucydidesBys);222// }223//224// // default implementation in case if org.openqa.selenium.support.FindBy was used225// org.openqa.selenium.support.FindBy seleniumBy = field.getAnnotation(org.openqa.selenium.support.FindBy.class);226// if (seleniumBy != null) {227// by = super.buildByFromFindBy(seleniumBy);228// }229//230// org.openqa.selenium.support.FindAll seleniumFindAll = field.getAnnotation(org.openqa.selenium.support.FindAll.class);231// if (seleniumFindAll != null) {232// by = super.buildBysFromFindByOneOf(seleniumFindAll);233// }234//235 if (by == null) {236 by = buildByFromCustomAnnotationProvider(field);237 }238 if (by == null) {239 by = super.buildBy();240 }241 if (by == null) {242 by = buildByFromDefault();243 }244 if (by == null) {245 throw new IllegalArgumentException("Cannot determine how to locate element " + field);246 }247 return by;248 }249 protected org.openqa.selenium.By buildByFromCustomAnnotationProvider( Field field) {250 return customFindByAnnotationProviderService.getCustomFindByAnnotationServices().stream()251 .filter(annotationService ->annotationService.isAnnotatedByCustomFindByAnnotation(field))252 .findFirst().map(annotationService ->annotationService.buildByFromCustomFindByAnnotation(field))253 .orElse(null);254 }255 protected org.openqa.selenium.By buildByFromFindBy(FindBy myFindBy) {256 assertValidFindBy(myFindBy);257 org.openqa.selenium.By by = buildByFromShortFindBy(myFindBy);258 if (by == null) {259 by = buildByFromLongFindBy(myFindBy);260 }261 return by;262 }263 protected org.openqa.selenium.By buildByFromLongFindBy(FindBy myFindBy) {264 How how = myFindBy.how();265 String using = myFindBy.using();266 switch (how) {267 case CLASS_NAME:268 return org.openqa.selenium.By.className(using);269 case CSS:270 return org.openqa.selenium.By.cssSelector(using);271 case ID:272 return org.openqa.selenium.By.id(using);273 case ID_OR_NAME:274 return new ByIdOrName(using);275 case LINK_TEXT:276 return org.openqa.selenium.By.linkText(using);277 case NAME:278 return org.openqa.selenium.By.name(using);279 case PARTIAL_LINK_TEXT:280 return org.openqa.selenium.By.partialLinkText(using);281 case TAG_NAME:282 return org.openqa.selenium.By.tagName(using);283 case XPATH:284 return org.openqa.selenium.By.xpath(using);285 case JQUERY:286 return By.jquery(using);287 case SCLOCATOR:288 return By.sclocator(using);289 case ACCESSIBILITY_ID:290 return MobileBy.AccessibilityId(using);291// case IOS_UI_AUTOMATION:292// return MobileBy.IosUIAutomation(using);293 case ANDROID_UI_AUTOMATOR:294 return MobileBy.AndroidUIAutomator(using);295 case IOS_CLASS_CHAIN:296 return MobileBy.iOSClassChain(using);297 case IOS_NS_PREDICATE_STRING:298 return MobileBy.iOSNsPredicateString(using);299 default:300 // Note that this shouldn't happen (eg, the above matches all301 // possible values for the How enum)302 throw new IllegalArgumentException("Cannot determine how to locate element " + field);303 }304 }305 protected org.openqa.selenium.By buildByFromShortFindBy(FindBy myFindBy) {306 if (isNotEmpty(myFindBy.className())) {307 return org.openqa.selenium.By.className(myFindBy.className());308 }309 if (isNotEmpty(myFindBy.css())) {310 return org.openqa.selenium.By.cssSelector(myFindBy.css());311 }312 if (isNotEmpty(myFindBy.id())) {313 return org.openqa.selenium.By.id(myFindBy.id());314 }315 if (isNotEmpty(myFindBy.linkText())) {316 return org.openqa.selenium.By.linkText(myFindBy.linkText());317 }318 if (isNotEmpty(myFindBy.name())) {319 return org.openqa.selenium.By.name(myFindBy.name());320 }321 if (isNotEmpty(myFindBy.ngModel())) {322 return org.openqa.selenium.By.cssSelector("*[ng-model='" + myFindBy.ngModel() + "']");323 }324 if (isNotEmpty(myFindBy.partialLinkText())) {325 return org.openqa.selenium.By.partialLinkText(myFindBy.partialLinkText());326 }327 if (isNotEmpty(myFindBy.tagName())) {328 return org.openqa.selenium.By.tagName(myFindBy.tagName());329 }330 if (isNotEmpty(myFindBy.xpath())) {331 return org.openqa.selenium.By.xpath(myFindBy.xpath());332 }333 if (isNotEmpty(myFindBy.sclocator())) {334 return By.sclocator(myFindBy.sclocator());335 }336 if (isNotEmpty(myFindBy.jquery())) {337 return By.jquery(myFindBy.jquery());338 }339 if (isNotEmpty(myFindBy.accessibilityId())) {340 return MobileBy.AccessibilityId(myFindBy.accessibilityId());341 }342 if (isNotEmpty(myFindBy.androidUIAutomator())) {343 return MobileBy.AndroidUIAutomator(myFindBy.androidUIAutomator());344 }345// if (isNotEmpty(myFindBy.iOSUIAutomation())) {346// // FIXME: Need to support android with platform switch347// return MobileBy.IosUIAutomation(myFindBy.iOSUIAutomation());348// }349 // Fall through350 return null;351 }352 private org.openqa.selenium.By getMobileBy(Annotation annotation, String valueName) {353 Strategies strategies[] = Strategies.values();354 for (Strategies strategy : strategies) {355 if (strategy.returnValueName().equals(valueName)) {356 return strategy.getBy(annotation);357 }358 }359 throw new IllegalArgumentException("@"360 + annotation.getClass().getSimpleName()361 + ": There is an unknown strategy " + valueName);362 }363 @SuppressWarnings("unchecked")364 private <T extends org.openqa.selenium.By> T getComplexMobileBy(Annotation[] annotations, Class<T> requiredByClass) {365 ;366 org.openqa.selenium.By[] byArray = new org.openqa.selenium.By[annotations.length];367 for (int i = 0; i < annotations.length; i++) {368 byArray[i] = getMobileBy(annotations[i],369 getFieldValue(annotations[i]));370 }371 try {372 Constructor<?> c = requiredByClass.getConstructor(org.openqa.selenium.By[].class);373 Object[] values = new Object[]{byArray};374 return (T) c.newInstance(values);375 } catch (Exception e) {376 throw new RuntimeException(e);377 }378 }379 private static String getFieldValue(Annotation mobileBy) {380 Method[] values = prepareAnnotationMethods(mobileBy.getClass());381 for (Method value : values) {382 try {383 String strategyParameter = value.invoke(mobileBy).toString();384 if (isNotEmpty(strategyParameter) && isStrategyName(value.getName())) {385 return value.getName();386 }387 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {388 throw new RuntimeException(e);389 }390 }391 throw new IllegalArgumentException("@"392 + mobileBy.getClass().getSimpleName() + ": one of "393 + Arrays.toString(Strategies.strategyNames()) + " should be filled");394 }395 private static boolean isStrategyName(String potentialStrategyName) {396 return Arrays.asList(Strategies.strategyNames()).contains(potentialStrategyName);397 }398 private static Method[] prepareAnnotationMethods(399 Class<? extends Annotation> annotation) {400 List<String> targetAnnotationMethodNamesList = getMethodNames(annotation.getDeclaredMethods());401 targetAnnotationMethodNamesList.removeAll(METHODS_TO_BE_EXCLUDED_WHEN_ANNOTATION_IS_READ);402 Method[] result = new Method[targetAnnotationMethodNamesList.size()];403 for (String methodName : targetAnnotationMethodNamesList) {404 try {405 result[targetAnnotationMethodNamesList.indexOf(methodName)] = annotation.getMethod(methodName, DEFAULT_ANNOTATION_METHOD_ARGUMENTS);406 } catch (NoSuchMethodException e) {407 throw new RuntimeException(e);408 } catch (SecurityException e) {409 throw new RuntimeException(e);410 }411 }412 return result;413 }414 private static List<String> getMethodNames(Method[] methods) {415 List<String> names = new ArrayList<String>();416 for (Method m : methods) {417 names.add(m.getName());418 }419 return names;420 }421 private final static List<String> METHODS_TO_BE_EXCLUDED_WHEN_ANNOTATION_IS_READ = new ArrayList<String>() {422 private static final long serialVersionUID = 1L;423 {424 List<String> objectClassMethodNames = getMethodNames(Object.class425 .getDeclaredMethods());426 addAll(objectClassMethodNames);427 List<String> annotationClassMethodNames = getMethodNames(Annotation.class428 .getDeclaredMethods());429 annotationClassMethodNames.removeAll(objectClassMethodNames);430 addAll(annotationClassMethodNames);431 }432 };433 private void assertValidFindBy(FindBy findBy) {434 if (findBy.how() != null) {435 if (findBy.using() == null) {436 throw new IllegalArgumentException(437 "If you set the 'how' property, you must also set 'using'");438 }439 }440 Set<String> finders = new HashSet<String>();441 if (!"".equals(findBy.using())) finders.add("how: " + findBy.using());442 if (!"".equals(findBy.className())) finders.add("class name:" + findBy.className());443 if (!"".equals(findBy.css())) finders.add("css:" + findBy.css());444 if (!"".equals(findBy.id())) finders.add("id: " + findBy.id());445 if (!"".equals(findBy.linkText())) finders.add("link text: " + findBy.linkText());446 if (!"".equals(findBy.name())) finders.add("name: " + findBy.name());447 if (!"".equals(findBy.ngModel())) finders.add("ngModel: " + findBy.ngModel());448 if (!"".equals(findBy.partialLinkText())) finders.add("partial link text: " + findBy.partialLinkText());449 if (!"".equals(findBy.tagName())) finders.add("tag name: " + findBy.tagName());450 if (!"".equals(findBy.xpath())) finders.add("xpath: " + findBy.xpath());451 if (!"".equals(findBy.sclocator())) finders.add("scLocator: " + findBy.sclocator());452 if (!"".equals(findBy.jquery())) finders.add("jquery: " + findBy.jquery());453 if (!"".equals(findBy.accessibilityId())) finders.add("accessibilityId: " + findBy.accessibilityId());454 if (!"".equals(findBy.androidUIAutomator())) finders.add("androidUIAutomator: " + findBy.androidUIAutomator());455 if (!"".equals(findBy.iOSUIAutomation())) finders.add("iOSUIAutomation: " + findBy.iOSUIAutomation());456 // A zero count is okay: it means to look by name or id.457 if (finders.size() > 1) {458 throw new IllegalArgumentException(459 String.format("You must specify at most one location strategy. Number found: %d (%s)",460 finders.size(), finders.toString()));461 }462 }463 // START - [dep3] *** todo [deprecate thucydides] Remove this once thucydides package name is removed464 /**465 * @deprecated use serenitybdd variation466 */467 @Deprecated468 protected org.openqa.selenium.By buildByFromFindBy(net.thucydides.core.annotations.findby.FindBy myDepFindBy) {469 assertValidFindBy(myDepFindBy);470 org.openqa.selenium.By ans = buildByFromShortFindBy(myDepFindBy);471 if (ans == null) {472 ans = buildByFromLongFindBy(myDepFindBy);473 }474 return ans;475 }476 /**477 * @deprecated use serenitybdd variation478 */479 @Deprecated480 protected org.openqa.selenium.By buildByFromLongFindBy(net.thucydides.core.annotations.findby.FindBy myDepFindBy) {481 How how = myDepFindBy.how();482 String using = myDepFindBy.using();483 switch (how) {484 case CLASS_NAME:485 return org.openqa.selenium.By.className(using);486 case CSS:487 return org.openqa.selenium.By.cssSelector(using);488 case ID:489 return org.openqa.selenium.By.id(using);490 case ID_OR_NAME:491 return new ByIdOrName(using);492 case LINK_TEXT:493 return org.openqa.selenium.By.linkText(using);494 case NAME:495 return org.openqa.selenium.By.name(using);496 case PARTIAL_LINK_TEXT:497 return org.openqa.selenium.By.partialLinkText(using);498 case TAG_NAME:499 return org.openqa.selenium.By.tagName(using);500 case XPATH:501 return org.openqa.selenium.By.xpath(using);502 case JQUERY:503 return By.jquery(using);504 case SCLOCATOR:505 return By.sclocator(using);506 default:507 // Note that this shouldn't happen (eg, the above matches all508 // possible values for the How enum)509 throw new IllegalArgumentException("Cannot determine how to locate element " + field);510 }511 }512 /**513 * @deprecated use serenitybdd variation514 */515 @Deprecated516 protected org.openqa.selenium.By buildByFromShortFindBy(net.thucydides.core.annotations.findby.FindBy myDepFindBy) {517 if (isNotEmpty(myDepFindBy.className())) {518 return org.openqa.selenium.By.className(myDepFindBy.className());519 }520 if (isNotEmpty(myDepFindBy.css())) {521 return org.openqa.selenium.By.cssSelector(myDepFindBy.css());522 }523 if (isNotEmpty(myDepFindBy.id())) {524 return org.openqa.selenium.By.id(myDepFindBy.id());525 }526 if (isNotEmpty(myDepFindBy.linkText())) {527 return org.openqa.selenium.By.linkText(myDepFindBy.linkText());528 }529 if (isNotEmpty(myDepFindBy.name())) {530 return org.openqa.selenium.By.name(myDepFindBy.name());531 }532 if (isNotEmpty(myDepFindBy.ngModel())) {533 return org.openqa.selenium.By.cssSelector("*[ng-model='" + myDepFindBy.ngModel() + "']");534 }535 if (isNotEmpty(myDepFindBy.partialLinkText())) {536 return org.openqa.selenium.By.partialLinkText(myDepFindBy.partialLinkText());537 }538 if (isNotEmpty(myDepFindBy.tagName())) {539 return org.openqa.selenium.By.tagName(myDepFindBy.tagName());540 }541 if (isNotEmpty(myDepFindBy.xpath())) {542 return org.openqa.selenium.By.xpath(myDepFindBy.xpath());543 }544 if (isNotEmpty(myDepFindBy.sclocator())) {545 return By.sclocator(myDepFindBy.sclocator());546 }547 if (isNotEmpty(myDepFindBy.jquery())) {548 return By.jquery(myDepFindBy.jquery());549 }550 // Fall through551 return null;552 }553 /**554 * @deprecated use serenitybdd variation555 */556 @Deprecated557 private void assertValidFindBy(net.thucydides.core.annotations.findby.FindBy findDepBy) {558 if (findDepBy.how() != null) {559 if (findDepBy.using() == null) {560 throw new IllegalArgumentException(561 "If you set the 'how' property, you must also set 'using'");562 }563 }564 Set<String> finders = new HashSet<String>();565 if (!"".equals(findDepBy.using())) finders.add("how: " + findDepBy.using());566 if (!"".equals(findDepBy.className())) finders.add("class name:" + findDepBy.className());567 if (!"".equals(findDepBy.css())) finders.add("css:" + findDepBy.css());568 if (!"".equals(findDepBy.id())) finders.add("id: " + findDepBy.id());569 if (!"".equals(findDepBy.linkText())) finders.add("link text: " + findDepBy.linkText());570 if (!"".equals(findDepBy.name())) finders.add("name: " + findDepBy.name());571 if (!"".equals(findDepBy.ngModel())) finders.add("ngModel: " + findDepBy.ngModel());572 if (!"".equals(findDepBy.partialLinkText())) finders.add("partial link text: " + findDepBy.partialLinkText());573 if (!"".equals(findDepBy.tagName())) finders.add("tag name: " + findDepBy.tagName());574 if (!"".equals(findDepBy.xpath())) finders.add("xpath: " + findDepBy.xpath());575 if (!"".equals(findDepBy.sclocator())) finders.add("scLocator: " + findDepBy.sclocator());576 if (!"".equals(findDepBy.jquery())) finders.add("jquery: " + findDepBy.jquery());577 // A zero count is okay: it means to look by name or id.578 if (finders.size() > 1) {579 throw new IllegalArgumentException(580 String.format("You must specify at most one location strategy. Number found: %d (%s)",581 finders.size(), finders.toString()));582 }583 }584 // END - [dep3] ***[deprecate thucydides] Remove this once thucydides package name is removed585}...

Full Screen

Full Screen

MobileBy.java

Source:MobileBy.java Github

copy

Full Screen

1/*2 * Licensed under the Apache License, Version 2.0 (the "License");3 * you may not use this file except in compliance with the License.4 * See the NOTICE file distributed with this work for additional5 * information regarding copyright ownership.6 * You may obtain a copy of the License at7 *8 * http://www.apache.org/licenses/LICENSE-2.09 *10 * Unless required by applicable law or agreed to in writing, software11 * distributed under the License is distributed on an "AS IS" BASIS,12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13 * See the License for the specific language governing permissions and14 * limitations under the License.15 */16package io.appium.java_client;17import org.apache.commons.lang3.StringUtils;18import org.openqa.selenium.By;19import org.openqa.selenium.SearchContext;20import org.openqa.selenium.WebDriverException;21import org.openqa.selenium.WebElement;22import java.io.Serializable;23import java.util.List;24@SuppressWarnings("serial")25public abstract class MobileBy extends By {26 private static final String ERROR_TEXT = "The class %s of the given context "27 + "doesn't implement %s nor %s. Sorry. It is impossible to find something.";28 private final String locatorString;29 private final MobileSelector selector;30 private static IllegalArgumentException formIllegalArgumentException(Class<?> givenClass,31 Class<?> class1, Class<?> class2) {32 return new IllegalArgumentException(String.format(ERROR_TEXT, givenClass.getCanonicalName(),33 class1.getCanonicalName(), class2.getCanonicalName()));34 }35 protected MobileBy(MobileSelector selector, String locatorString) {36 if (StringUtils.isBlank(locatorString)) {37 throw new IllegalArgumentException("Must supply a not empty locator value.");38 }39 this.locatorString = locatorString;40 this.selector = selector;41 }42 protected String getLocatorString() {43 return locatorString;44 }45 @SuppressWarnings("unchecked")46 @Override public List<WebElement> findElements(SearchContext context) {47 return (List<WebElement>) ((FindsByFluentSelector<?>) context)48 .findElements(selector.toString(), getLocatorString());49 }50 @Override public WebElement findElement(SearchContext context) {51 return ((FindsByFluentSelector<?>) context)52 .findElement(selector.toString(), getLocatorString());53 }54 /**55 * Read https://developer.apple.com/library/tvos/documentation/DeveloperTools/56 * Conceptual/InstrumentsUserGuide/UIAutomation.html57 *58 * @param iOSAutomationText is iOS UIAutomation string59 * @return an instance of {@link io.appium.java_client.MobileBy.ByIosUIAutomation}60 */61 public static By IosUIAutomation(final String iOSAutomationText) {62 return new ByIosUIAutomation(iOSAutomationText);63 }64 /**65 * Read http://developer.android.com/intl/ru/tools/testing-support-library/66 * index.html#uia-apis67 * @param uiautomatorText is Android UIAutomator string68 * @return an instance of {@link io.appium.java_client.MobileBy.ByAndroidUIAutomator}69 */70 public static By AndroidUIAutomator(final String uiautomatorText) {71 return new ByAndroidUIAutomator(uiautomatorText);72 }73 /**74 * About Android accessibility75 * https://developer.android.com/intl/ru/training/accessibility/accessible-app.html76 * About iOS accessibility77 * https://developer.apple.com/library/ios/documentation/UIKit/Reference/78 * UIAccessibilityIdentification_Protocol/index.html79 * @param accessibilityId id is a convenient UI automation accessibility Id.80 * @return an instance of {@link io.appium.java_client.MobileBy.ByAndroidUIAutomator}81 */82 public static By AccessibilityId(final String accessibilityId) {83 return new ByAccessibilityId(accessibilityId);84 }85 /**86 * This locator strategy is available in XCUITest Driver mode87 * @param iOSClassChainString is a valid class chain locator string.88 * See <a href="https://github.com/facebook/WebDriverAgent/wiki/Queries">89 * the documentation</a> for more details90 * @return an instance of {@link io.appium.java_client.MobileBy.ByIosClassChain}91 */92 public static By iOSClassChain(final String iOSClassChainString) {93 return new ByIosClassChain(iOSClassChainString);94 }95 /**96 * This locator strategy is available in XCUITest Driver mode97 * @param iOSNsPredicateString is an an iOS NsPredicate String98 * @return an instance of {@link io.appium.java_client.MobileBy.ByIosNsPredicate}99 */100 public static By iOSNsPredicateString(final String iOSNsPredicateString) {101 return new ByIosNsPredicate(iOSNsPredicateString);102 }103 public static By windowsAutomation(final String windowsAutomation) {104 return new ByWindowsAutomation(windowsAutomation);105 }106 107 public static class ByIosUIAutomation extends MobileBy implements Serializable {108 public ByIosUIAutomation(String iOSAutomationText) {109 super(MobileSelector.IOS_UI_AUTOMATION, iOSAutomationText);110 }111 /**112 * @throws WebDriverException when current session doesn't support the given selector or when113 * value of the selector is not consistent.114 * @throws IllegalArgumentException when it is impossible to find something on the given115 * {@link SearchContext} instance116 */117 @SuppressWarnings("unchecked")118 @Override119 public List<WebElement> findElements(SearchContext context) throws WebDriverException,120 IllegalArgumentException {121 Class<?> contextClass = context.getClass();122 if (FindsByIosUIAutomation.class.isAssignableFrom(contextClass)) {123 return FindsByIosUIAutomation.class.cast(context)124 .findElementsByIosUIAutomation(getLocatorString());125 }126 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {127 return super.findElements(context);128 }129 throw formIllegalArgumentException(contextClass, FindsByIosUIAutomation.class,130 FindsByFluentSelector.class);131 }132 /**133 * @throws WebDriverException when current session doesn't support the given selector or when134 * value of the selector is not consistent.135 * @throws IllegalArgumentException when it is impossible to find something on the given136 * {@link SearchContext} instance137 */138 @Override public WebElement findElement(SearchContext context) throws WebDriverException,139 IllegalArgumentException {140 Class<?> contextClass = context.getClass();141 if (FindsByIosUIAutomation.class.isAssignableFrom(contextClass)) {142 return ((FindsByIosUIAutomation<?>) context)143 .findElementByIosUIAutomation(getLocatorString());144 }145 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {146 return super.findElement(context);147 }148 throw formIllegalArgumentException(contextClass, FindsByIosUIAutomation.class,149 FindsByFluentSelector.class);150 }151 @Override public String toString() {152 return "By.IosUIAutomation: " + getLocatorString();153 }154 }155 public static class ByAndroidUIAutomator extends MobileBy implements Serializable {156 public ByAndroidUIAutomator(String uiautomatorText) {157 super(MobileSelector.ANDROID_UI_AUTOMATOR, uiautomatorText);158 }159 /**160 * @throws WebDriverException when current session doesn't support the given selector or when161 * value of the selector is not consistent.162 * @throws IllegalArgumentException when it is impossible to find something on the given163 * {@link SearchContext} instance164 */165 @SuppressWarnings("unchecked")166 @Override167 public List<WebElement> findElements(SearchContext context) throws WebDriverException,168 IllegalArgumentException {169 Class<?> contextClass = context.getClass();170 if (FindsByAndroidUIAutomator.class.isAssignableFrom(contextClass)) {171 return FindsByAndroidUIAutomator.class.cast(context)172 .findElementsByAndroidUIAutomator(getLocatorString());173 }174 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {175 return super.findElements(context);176 }177 throw formIllegalArgumentException(contextClass, FindsByAndroidUIAutomator.class,178 FindsByFluentSelector.class);179 }180 /**181 * @throws WebDriverException when current session doesn't support the given selector or when182 * value of the selector is not consistent.183 * @throws IllegalArgumentException when it is impossible to find something on the given184 * {@link SearchContext} instance185 */186 @Override public WebElement findElement(SearchContext context) throws WebDriverException,187 IllegalArgumentException {188 Class<?> contextClass = context.getClass();189 if (FindsByAndroidUIAutomator.class.isAssignableFrom(contextClass)) {190 return FindsByAndroidUIAutomator.class.cast(context)191 .findElementByAndroidUIAutomator(getLocatorString());192 }193 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {194 return super.findElement(context);195 }196 throw formIllegalArgumentException(contextClass, FindsByAndroidUIAutomator.class,197 FindsByFluentSelector.class);198 }199 @Override public String toString() {200 return "By.AndroidUIAutomator: " + getLocatorString();201 }202 }203 public static class ByAccessibilityId extends MobileBy implements Serializable {204 public ByAccessibilityId(String accessibilityId) {205 super(MobileSelector.ACCESSIBILITY, accessibilityId);206 }207 /**208 * @throws WebDriverException when current session doesn't support the given selector or when209 * value of the selector is not consistent.210 * @throws IllegalArgumentException when it is impossible to find something on the given211 * {@link SearchContext} instance212 */213 @SuppressWarnings("unchecked")214 @Override215 public List<WebElement> findElements(SearchContext context) throws WebDriverException,216 IllegalArgumentException {217 Class<?> contextClass = context.getClass();218 if (FindsByAccessibilityId.class.isAssignableFrom(contextClass)) {219 return FindsByAccessibilityId.class.cast(context)220 .findElementsByAccessibilityId(getLocatorString());221 }222 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {223 return super.findElements(context);224 }225 throw formIllegalArgumentException(contextClass, FindsByAccessibilityId.class,226 FindsByFluentSelector.class);227 }228 /**229 * @throws WebDriverException when current session doesn't support the given selector or when230 * value of the selector is not consistent.231 * @throws IllegalArgumentException when it is impossible to find something on the given232 * {@link SearchContext} instance233 */234 @Override public WebElement findElement(SearchContext context) throws WebDriverException,235 IllegalArgumentException {236 Class<?> contextClass = context.getClass();237 if (FindsByAccessibilityId.class.isAssignableFrom(contextClass)) {238 return FindsByAccessibilityId.class.cast(context)239 .findElementByAccessibilityId(getLocatorString());240 }241 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {242 return super.findElement(context);243 }244 throw formIllegalArgumentException(contextClass, FindsByAccessibilityId.class,245 FindsByFluentSelector.class);246 }247 @Override public String toString() {248 return "By.AccessibilityId: " + getLocatorString();249 }250 }251 public static class ByIosClassChain extends MobileBy implements Serializable {252 protected ByIosClassChain(String locatorString) {253 super(MobileSelector.IOS_CLASS_CHAIN, locatorString);254 }255 /**256 * @throws WebDriverException when current session doesn't support the given selector or when257 * value of the selector is not consistent.258 * @throws IllegalArgumentException when it is impossible to find something on the given259 * {@link SearchContext} instance260 */261 @SuppressWarnings("unchecked")262 @Override public List<WebElement> findElements(SearchContext context) {263 Class<?> contextClass = context.getClass();264 if (FindsByIosClassChain.class.isAssignableFrom(contextClass)) {265 return FindsByIosClassChain.class.cast(context)266 .findElementsByIosClassChain(getLocatorString());267 }268 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {269 return super.findElements(context);270 }271 throw formIllegalArgumentException(contextClass, FindsByIosClassChain.class,272 FindsByFluentSelector.class);273 }274 /**275 * @throws WebDriverException when current session doesn't support the given selector or when276 * value of the selector is not consistent.277 * @throws IllegalArgumentException when it is impossible to find something on the given278 * {@link SearchContext} instance279 */280 @Override public WebElement findElement(SearchContext context) {281 Class<?> contextClass = context.getClass();282 if (FindsByIosClassChain.class.isAssignableFrom(contextClass)) {283 return FindsByIosClassChain.class.cast(context)284 .findElementByIosClassChain(getLocatorString());285 }286 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {287 return super.findElement(context);288 }289 throw formIllegalArgumentException(contextClass, FindsByIosClassChain.class,290 FindsByFluentSelector.class);291 }292 @Override public String toString() {293 return "By.IosClassChain: " + getLocatorString();294 }295 }296 public static class ByIosNsPredicate extends MobileBy implements Serializable {297 protected ByIosNsPredicate(String locatorString) {298 super(MobileSelector.IOS_PREDICATE_STRING, locatorString);299 }300 /**301 * @throws WebDriverException when current session doesn't support the given selector or when302 * value of the selector is not consistent.303 * @throws IllegalArgumentException when it is impossible to find something on the given304 * {@link SearchContext} instance305 */306 @SuppressWarnings("unchecked")307 @Override public List<WebElement> findElements(SearchContext context) {308 Class<?> contextClass = context.getClass();309 if (FindsByIosNSPredicate.class.isAssignableFrom(contextClass)) {310 return FindsByIosNSPredicate.class.cast(context)311 .findElementsByIosNsPredicate(getLocatorString());312 }313 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {314 return super.findElements(context);315 }316 throw formIllegalArgumentException(contextClass, FindsByIosNSPredicate.class,317 FindsByFluentSelector.class);318 }319 /**320 * @throws WebDriverException when current session doesn't support the given selector or when321 * value of the selector is not consistent.322 * @throws IllegalArgumentException when it is impossible to find something on the given323 * {@link SearchContext} instance324 */325 @Override public WebElement findElement(SearchContext context) {326 Class<?> contextClass = context.getClass();327 if (FindsByIosNSPredicate.class.isAssignableFrom(contextClass)) {328 return FindsByIosNSPredicate.class.cast(context)329 .findElementByIosNsPredicate(getLocatorString());330 }331 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {332 return super.findElement(context);333 }334 throw formIllegalArgumentException(contextClass, FindsByIosNSPredicate.class,335 FindsByFluentSelector.class);336 }337 @Override public String toString() {338 return "By.IosNsPredicate: " + getLocatorString();339 }340 }341 public static class ByWindowsAutomation extends MobileBy implements Serializable {342 protected ByWindowsAutomation(String locatorString) {343 super(MobileSelector.WINDOWS_UI_AUTOMATION, locatorString);344 }345 /**346 * @throws WebDriverException when current session doesn't support the given selector or when347 * value of the selector is not consistent.348 * @throws IllegalArgumentException when it is impossible to find something on the given349 * {@link SearchContext} instance350 */351 @SuppressWarnings("unchecked")352 @Override public List<WebElement> findElements(SearchContext context) {353 Class<?> contextClass = context.getClass();354 if (FindsByWindowsAutomation.class.isAssignableFrom(contextClass)) {355 return FindsByWindowsAutomation.class.cast(context)356 .findElementsByWindowsUIAutomation(getLocatorString());357 }358 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {359 return super.findElements(context);360 }361 throw formIllegalArgumentException(contextClass, FindsByWindowsAutomation.class,362 FindsByFluentSelector.class);363 }364 /**365 * @throws WebDriverException when current session doesn't support the given selector or when366 * value of the selector is not consistent.367 * @throws IllegalArgumentException when it is impossible to find something on the given368 * {@link SearchContext} instance369 */370 @Override public WebElement findElement(SearchContext context) {371 Class<?> contextClass = context.getClass();372 if (FindsByWindowsAutomation.class.isAssignableFrom(contextClass)) {373 return FindsByWindowsAutomation.class.cast(context)374 .findElementByWindowsUIAutomation(getLocatorString());375 }376 if (FindsByFluentSelector.class.isAssignableFrom(context.getClass())) {377 return super.findElement(context);378 }379 throw formIllegalArgumentException(contextClass, FindsByIosNSPredicate.class,380 FindsByWindowsAutomation.class);381 }382 }383}...

Full Screen

Full Screen

By.java

Source:By.java Github

copy

Full Screen

1// Licensed to the Software Freedom Conservancy (SFC) under one2// or more contributor license agreements. See the NOTICE file3// distributed with this work for additional information4// regarding copyright ownership. The SFC licenses this file5// to you under the Apache License, Version 2.0 (the6// "License"); you may not use this file except in compliance7// with the License. You may obtain a copy of the License at8//9// http://www.apache.org/licenses/LICENSE-2.010//11// Unless required by applicable law or agreed to in writing,12// software distributed under the License is distributed on an13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY14// KIND, either express or implied. See the License for the15// specific language governing permissions and limitations16// under the License.17package com.testpros.fast;18import io.appium.java_client.MobileSelector;19/**20 * Mechanism used to locate elements within a document. In order to create your own locating21 * mechanisms, it is possible to subclass this class and override the protected methods as required,22 * though it is expected that all subclasses rely on the basic finding mechanisms provided23 * through static methods of this class:24 *25 * <code>26 * public WebElement findElement(WebDriver driver) {27 * WebElement element = driver.findElement(By.id(getSelector()));28 * if (element == null)29 * element = driver.findElement(By.name(getSelector());30 * return element;31 * }32 * </code>33 */34//public class By extends io.appium.java_client.MobileBy {35//public abstract class By extends org.openqa.selenium.By {36public class By {37 org.openqa.selenium.By by;38 public By(org.openqa.selenium.By by) {39 this.by = by;40 }41 public org.openqa.selenium.By getBy() {42 return by;43 }44 45 /**46 * @param id The value of the "id" attribute to search for.47 * @return A By which locates elements by the value of the "id" attribute.48 */49 public static By id(String id) {50 return new By(org.openqa.selenium.By.id(id));51 }52 /**53 * @param linkText The exact text to match against.54 * @return A By which locates A elements by the exact text it displays.55 */56 public static By linkText(String linkText) {57 return new By(org.openqa.selenium.By.linkText(linkText));58 }59 /**60 * @param partialLinkText The partial text to match against61 * @return a By which locates elements that contain the given link text.62 */63 public static By partialLinkText(String partialLinkText) {64 return new By(org.openqa.selenium.By.partialLinkText(partialLinkText));65 }66 /**67 * @param name The value of the "name" attribute to search for.68 * @return A By which locates elements by the value of the "name" attribute.69 */70 public static By name(String name) {71 return new By(org.openqa.selenium.By.name(name));72 }73 /**74 * @param tagName The element's tag name.75 * @return A By which locates elements by their tag name.76 */77 public static By tagName(String tagName) {78 return new By(org.openqa.selenium.By.tagName(tagName));79 }80 /**81 * @param xpathExpression The XPath to use.82 * @return A By which locates elements via XPath.83 */84 public static By xpath(String xpathExpression) {85 return new By(org.openqa.selenium.By.xpath(xpathExpression));86 }87 /**88 * Find elements based on the value of the "class" attribute. If an element has multiple classes, then89 * this will match against each of them. For example, if the value is "one two onone", then the90 * class names "one" and "two" will match.91 *92 * @param className The value of the "class" attribute to search for.93 * @return A By which locates elements by the value of the "class" attribute.94 */95 public static By className(String className) {96 return new By(org.openqa.selenium.By.className(className));97 }98 /**99 * Find elements via the driver's underlying W3C Selector engine. If the browser does not100 * implement the Selector API, a best effort is made to emulate the API. In this case, we strive101 * for at least CSS2 support, but offer no guarantees.102 *103 * @param cssSelector CSS expression.104 * @return A By which locates elements by CSS.105 */106 public static By cssSelector(String cssSelector) {107 return new By(org.openqa.selenium.By.cssSelector(cssSelector));108 }109 /**110 * Read http://developer.android.com/intl/ru/tools/testing-support-library/111 * index.html#uia-apis112 *113 * @param uiautomatorText is Android UIAutomator string114 * @return an instance of {@link By.ByAndroidUIAutomator}115 */116 public static By AndroidUIAutomator(final String uiautomatorText) {117 return new By(io.appium.java_client.MobileBy.AndroidUIAutomator(uiautomatorText));118 }119 /**120 * About Android accessibility121 * https://developer.android.com/intl/ru/training/accessibility/accessible-app.html122 * About iOS accessibility123 * https://developer.apple.com/library/ios/documentation/UIKit/Reference/124 * UIAccessibilityIdentification_Protocol/index.html125 *126 * @param accessibilityId id is a convenient UI automation accessibility Id.127 * @return an instance of {@link By.ByAndroidUIAutomator}128 */129 public static By AccessibilityId(final String accessibilityId) {130 return new By(io.appium.java_client.MobileBy.AccessibilityId(accessibilityId));131 }132 /**133 * This locator strategy is available in XCUITest Driver mode.134 *135 * @param iOSClassChainString is a valid class chain locator string.136 * See <a href="https://github.com/facebook/WebDriverAgent/wiki/Queries">137 * the documentation</a> for more details138 * @return an instance of {@link By.ByIosClassChain}139 */140 public static By iOSClassChain(final String iOSClassChainString) {141 return new By(io.appium.java_client.MobileBy.iOSClassChain(iOSClassChainString));142 }143 /**144 * This locator strategy is only available in Espresso Driver mode.145 *146 * @param dataMatcherString is a valid class chain locator string.147 * See <a href="https://github.com/appium/appium-espresso-driver/pull/386">148 * the documentation</a> for more details149 * @return an instance of {@link By.ByAndroidDataMatcher}150 */151 public static By androidDataMatcher(final String dataMatcherString) {152 return new By(io.appium.java_client.MobileBy.androidDataMatcher(dataMatcherString));153 }154 /**155 * This locator strategy is available in XCUITest Driver mode.156 *157 * @param iOSNsPredicateString is an an iOS NsPredicate String158 * @return an instance of {@link By.ByIosNsPredicate}159 */160 public static By iOSNsPredicateString(final String iOSNsPredicateString) {161 return new By(io.appium.java_client.MobileBy.iOSNsPredicateString(iOSNsPredicateString));162 }163 public static By windowsAutomation(final String windowsAutomation) {164 return new By(io.appium.java_client.MobileBy.windowsAutomation(windowsAutomation));165 }166 /**167 * This locator strategy is available in Espresso Driver mode.168 *169 * @param tag is an view tag string170 * @return an instance of {@link ByAndroidViewTag}171 * @since Appium 1.8.2 beta172 */173 public static By AndroidViewTag(final String tag) {174 return new By(io.appium.java_client.MobileBy.AndroidViewTag(tag));175 }176 /**177 * This locator strategy is available only if OpenCV libraries and178 * NodeJS bindings are installed on the server machine.179 *180 * @param b64Template base64-encoded template image string. Supported image formats are the same181 * as for OpenCV library.182 * @return an instance of {@link ByImage}183 * @see <a href="https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md">184 * The documentation on Image Comparison Features</a>185 * @see <a href="https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js">186 * The settings available for lookup fine-tuning</a>187 * @since Appium 1.8.2188 */189 public static By image(final String b64Template) {190 return new By(io.appium.java_client.MobileBy.image(b64Template));191 }192 /**193 * This type of locator requires the use of the 'customFindModules' capability and a194 * separately-installed element finding plugin.195 *196 * @param selector selector to pass to the custom element finding plugin197 * @return an instance of {@link ByCustom}198 * @since Appium 1.9.2199 */200 public static By custom(final String selector) {201 return new By(io.appium.java_client.MobileBy.custom(selector));202 }203}...

Full Screen

Full Screen

ByParserTest.java

Source:ByParserTest.java Github

copy

Full Screen

1/*2 * MIT License3 *4 * Copyright (c) 2018 Excelium5 *6 * Permission is hereby granted, free of charge, to any person obtaining a copy7 * of this software and associated documentation files (the "Software"), to deal8 * in the Software without restriction, including without limitation the rights9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell10 * copies of the Software, and to permit persons to whom the Software is11 * furnished to do so, subject to the following conditions:12 *13 * The above copyright notice and this permission notice shall be included in all14 * copies or substantial portions of the Software.15 *16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE22 * SOFTWARE.23 */24package excelium.core.by;25import excelium.core.driver.ContextAwareWebDriver;26import io.appium.java_client.MobileBy;27import mockit.Expectations;28import mockit.Mocked;29import org.junit.Assert;30import org.junit.Test;31import org.openqa.selenium.By;32import org.openqa.selenium.support.ByIdOrName;33/**34 * Tests for {@link ByParser}.35 *36 * @author PhungDucKien37 * @since 2018.05.1638 */39public class ByParserTest {40 @Mocked41 private ContextAwareWebDriver webDriver;42 @Test43 public void testParseByWeb() {44 new Expectations() {{45 webDriver.isWebContext(); result = true;46 }};47 By by = ByParser.parseBy("id=id", webDriver);48 Assert.assertTrue(by instanceof By.ById);49 Assert.assertEquals("By.id: id", by.toString());50 by = ByParser.parseBy("link=link", webDriver);51 Assert.assertTrue(by instanceof By.ByLinkText);52 Assert.assertEquals("By.linkText: link", by.toString());53 by = ByParser.parseBy("partial link=link", webDriver);54 Assert.assertTrue(by instanceof By.ByPartialLinkText);55 Assert.assertEquals("By.partialLinkText: link", by.toString());56 by = ByParser.parseBy("tag=button", webDriver);57 Assert.assertTrue(by instanceof By.ByTagName);58 Assert.assertEquals("By.tagName: button", by.toString());59 by = ByParser.parseBy("name=name", webDriver);60 Assert.assertTrue(by instanceof By.ByName);61 Assert.assertEquals("By.name: name", by.toString());62 by = ByParser.parseBy("class=class", webDriver);63 Assert.assertTrue(by instanceof By.ByClassName);64 Assert.assertEquals("By.className: class", by.toString());65 by = ByParser.parseBy("css=css", webDriver);66 Assert.assertTrue(by instanceof ByCss);67 Assert.assertEquals("By.css: css", by.toString());68 by = ByParser.parseBy("xpath=//xpath", webDriver);69 Assert.assertTrue(by instanceof By.ByXPath);70 Assert.assertEquals("By.xpath: //xpath", by.toString());71 by = ByParser.parseBy("identifier=identifier", webDriver);72 Assert.assertTrue(by instanceof ByIdOrName);73 Assert.assertEquals("by id or name \"identifier\"", by.toString());74 by = ByParser.parseBy("alt=alt", webDriver);75 Assert.assertTrue(by instanceof ByAlt);76 Assert.assertEquals("By.alt: alt", by.toString());77 by = ByParser.parseBy("dom=dom", webDriver);78 Assert.assertTrue(by instanceof ByDom);79 Assert.assertEquals("By.dom: dom", by.toString());80 by = ByParser.parseBy("index=1", webDriver);81 Assert.assertTrue(by instanceof ByIndex);82 Assert.assertEquals("By.index: [null][1]", by.toString());83 by = ByParser.parseBy("variable=variable", webDriver);84 Assert.assertTrue(by instanceof ByVariable);85 Assert.assertEquals("By.variable: variable", by.toString());86 by = ByParser.parseBy("//xpath", webDriver);87 Assert.assertTrue(by instanceof By.ByXPath);88 Assert.assertEquals("By.xpath: //xpath", by.toString());89 by = ByParser.parseBy("document.getElementById('login-btn')", webDriver);90 Assert.assertTrue(by instanceof ByDom);91 Assert.assertEquals("By.dom: document.getElementById('login-btn')", by.toString());92 by = ByParser.parseBy("identifier", webDriver);93 Assert.assertTrue(by instanceof ByIdOrName);94 Assert.assertEquals("by id or name \"identifier\"", by.toString());95 }96 @Test97 public void testParseByMobile() {98 new Expectations() {{99 webDriver.isWebContext(); result = false;100 }};101 By by = ByParser.parseBy("accessibility id=accessibility id", webDriver);102 Assert.assertTrue(by instanceof MobileBy.ByAccessibilityId);103 Assert.assertEquals("By.AccessibilityId: accessibility id", by.toString());104 by = ByParser.parseBy("class=class", webDriver);105 Assert.assertTrue(by instanceof MobileBy.ByClassName);106 Assert.assertEquals("By.className: class", by.toString());107 by = ByParser.parseBy("id=id", webDriver);108 Assert.assertTrue(by instanceof MobileBy.ById);109 Assert.assertEquals("By.id: id", by.toString());110 by = ByParser.parseBy("name=name", webDriver);111 Assert.assertTrue(by instanceof MobileBy.ByName);112 Assert.assertEquals("By.name: name", by.toString());113 by = ByParser.parseBy("xpath=//xpath", webDriver);114 Assert.assertTrue(by instanceof MobileBy.ByXPath);115 Assert.assertEquals("By.xpath: //xpath", by.toString());116 by = ByParser.parseBy("android uiautomator=android uiautomator", webDriver);117 Assert.assertTrue(by instanceof MobileBy.ByAndroidUIAutomator);118 Assert.assertEquals("By.AndroidUIAutomator: android uiautomator", by.toString());119 by = ByParser.parseBy("android viewtag=android viewtag", webDriver);120 Assert.assertTrue(by instanceof MobileBy.ByAndroidViewTag);121 Assert.assertEquals("By.AndroidViewTag: android viewtag", by.toString());122 by = ByParser.parseBy("android datamatcher=android datamatcher", webDriver);123 Assert.assertTrue(by instanceof MobileBy.ByAndroidDataMatcher);124 Assert.assertEquals("By.FindsByAndroidDataMatcher: android datamatcher", by.toString());125 by = ByParser.parseBy("ios predicate string=ios predicate string", webDriver);126 Assert.assertTrue(by instanceof MobileBy.ByIosNsPredicate);127 Assert.assertEquals("By.IosNsPredicate: ios predicate string", by.toString());128 by = ByParser.parseBy("ios class chain=ios class chain", webDriver);129 Assert.assertTrue(by instanceof MobileBy.ByIosClassChain);130 Assert.assertEquals("By.IosClassChain: ios class chain", by.toString());131 by = ByParser.parseBy("windows uiautomation=windows uiautomation", webDriver);132 Assert.assertTrue(by instanceof MobileBy.ByWindowsAutomation);133 by = ByParser.parseBy("index=1", webDriver);134 Assert.assertTrue(by instanceof ByIndex);135 Assert.assertEquals("By.index: [null][1]", by.toString());136 by = ByParser.parseBy("variable=variable", webDriver);137 Assert.assertTrue(by instanceof ByVariable);138 Assert.assertEquals("By.variable: variable", by.toString());139 by = ByParser.parseBy("//xpath", webDriver);140 Assert.assertTrue(by instanceof MobileBy.ByXPath);141 Assert.assertEquals("By.xpath: //xpath", by.toString());142 by = ByParser.parseBy("accessibility id", webDriver);143 Assert.assertTrue(by instanceof MobileBy.ByAccessibilityId);144 Assert.assertEquals("By.AccessibilityId: accessibility id", by.toString());145 }146}...

Full Screen

Full Screen

Mobile.java

Source:Mobile.java Github

copy

Full Screen

1package id.aldochristiaan.salad.module;2import id.aldochristiaan.salad.util.LogUtil;3import io.appium.java_client.MobileBy;4import org.openqa.selenium.By;5import org.openqa.selenium.NoSuchElementException;6import static id.aldochristiaan.salad.Salad.ELEMENT_PROPERTIES;7public class Mobile {8 protected By getLocator(String elementLocator) {9 String elementValue = ELEMENT_PROPERTIES.getProperty(elementLocator);10 if (elementValue == null) {11 LogUtil.error("Couldn't find locator : " + elementLocator + " ! Please check properties file!");12 throw new NoSuchElementException("Couldn't find locator : " + elementLocator);13 }14 String[] locator = elementValue.split("_");15 String locatorType = locator[0];16 String locatorValue = elementValue.substring(elementValue.indexOf("_") + 1);17 switch (locatorType) {18 case "id":19 return MobileBy.id(locatorValue);20 case "accessibilityId":21 return MobileBy.AccessibilityId(locatorValue);22 case "contentDescription":23 return MobileBy.xpath("//*[@content-desc='" + locatorValue + "']");24 case "name":25 return MobileBy.ByIosNsPredicate.iOSNsPredicateString("name == '" + locatorValue + "'");26 case "label":27 return MobileBy.ByIosNsPredicate.iOSNsPredicateString("label == '" + locatorValue + "'");28 case "value":29 return MobileBy.ByIosNsPredicate.iOSNsPredicateString("value == '" + locatorValue + "'");30 case "labelcontains":31 return MobileBy.ByIosNsPredicate.iOSNsPredicateString("label CONTAINS '" + locatorValue + "'");32 case "viewTag":33 return MobileBy.AndroidViewTag(locatorValue);34 case "xpath":35 return MobileBy.xpath(locatorValue);36 case "class":37 return MobileBy.className(locatorValue);38 case "text":39 return MobileBy.xpath("//*[@text='" + locatorValue + "']");40 case "containsText":41 return MobileBy.xpath("//*[contains(@text, '" + locatorValue + "')]");42 case "translationText":43 return MobileBy.xpath("//*[contains(@text,'" + locatorValue + "') or contains(@text, " +44 "translate('" + locatorValue + "', 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')) or " +45 "contains(@text, translate('" + locatorValue + "', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]");46 default:47 return null;48 }49 }50 protected String constructLocator(String elementLocator, Object... args) {51 String elementValue = ELEMENT_PROPERTIES.getProperty(elementLocator);52 String constructedValue = String.format(elementValue, args);53 String constructedLocator = "TEMP_" + elementLocator;54 try {55 ELEMENT_PROPERTIES.remove(constructedLocator);56 } catch (NullPointerException e) {57 LogUtil.info("No properties key was found!");58 }59 ELEMENT_PROPERTIES.setProperty(60 constructedLocator,61 constructedValue62 );63 return constructedLocator;64 }65 protected void delay(int milliseconds) {66 try {67 Thread.sleep(milliseconds);68 } catch (InterruptedException e) {69 e.printStackTrace();70 }71 }72}...

Full Screen

Full Screen

IOSByFactory.java

Source:IOSByFactory.java Github

copy

Full Screen

1package ru.colibri.ui.settings.ios;2import io.appium.java_client.MobileBy;3import org.apache.commons.lang3.StringUtils;4import org.openqa.selenium.By;5import org.springframework.stereotype.Component;6import ru.colibri.ui.core.fields.IElement;7import ru.colibri.ui.core.finder.factories.ByFactory;8import static java.lang.String.format;9@Component10public class IOSByFactory extends ByFactory {11 private static String IOSNSPREDICATE_TEMPLATE = "name contains '%1$s' or value contains '%1$s' or label contains '%1$s'";12 private String XPATH_TEMPLATE = "//*[contains(@name,'%1$s') or contains(@value,'%1$s') or contains(@label,'%1$s')]";13 public By byNameOrValueOrLabel(String label) {14 return byIOSNSPredicate(createIOSNSPredicateByNameOrValueOrLabel(label));15 }16 private String createXPathByNameOrValueOrLabel(String label) {17 return format(XPATH_TEMPLATE, label);18 }19 private String createIOSNSPredicateByNameOrValueOrLabel(String label) {20 return format(IOSNSPREDICATE_TEMPLATE, label);21 }22 @Override23 public By byElement(IElement element) {24 if (!StringUtils.isEmpty(element.getNSPredicate())) {25 return byIOSNSPredicate(element.getNSPredicate());26 }27 if (StringUtils.isEmpty(element.getXpath())) {28 if (StringUtils.isEmpty(element.getId())) {29 return byNameOrValueOrLabel(element.getText());30 } else {31 return byId(element.getId());32 }33 } else {34 return byXpath(element.getXpath());35 }36 }37 public By getNestedElements(IElement parent, IElement nested) {38 return By.xpath(createSearchXpath(parent) + createSearchXpath(nested));39 }40 private String createSearchXpath(IElement element) {41 if (!StringUtils.isEmpty(element.getXpath())) {42 return element.getXpath();43 } else {44 if (!StringUtils.isEmpty(element.getId())) {45 return createXPathByNameOrValueOrLabel(element.getId());46 } else {47 return createXPathByNameOrValueOrLabel(element.getText());48 }49 }50 }51 public MobileBy byIOSNSPredicate(String predicate) {52 return (MobileBy) MobileBy.iOSNsPredicateString(predicate);53 }54}...

Full Screen

Full Screen

MobileBy.ByIosNsPredicate

Using AI Code Generation

copy

Full Screen

1MobileElement element = (MobileElement) driver.findElement(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"));2MobileElement element = (MobileElement) driver.FindElement(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"));3element = driver.find_element(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"))4element = driver.find_element(:predicate, "type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'")5element = driver.find_element(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"))6element = driver.find_element(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"))7element = driver.find_element(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"))8element := driver.FindElement(MobileBy.ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"))9$element = $driver->findElement(MobileBy::ByIosNsPredicate("type == 'XCUIElementTypeButton' AND name == 'ComputeSumButton'"));

Full Screen

Full Screen

MobileBy.ByIosNsPredicate

Using AI Code Generation

copy

Full Screen

1package appium.java;2import java.net.MalformedURLException;3import java.net.URL;4import java.util.concurrent.TimeUnit;5import org.openqa.selenium.By;6import org.openqa.selenium.remote.DesiredCapabilities;7import io.appium.java_client.MobileBy;8import io.appium.java_client.ios.IOSDriver;9import io.appium.java_client.ios.IOSElement;10public class iOSNativeApp {11public static void main(String[] args) throws MalformedURLException, InterruptedException {

Full Screen

Full Screen

MobileBy.ByIosNsPredicate

Using AI Code Generation

copy

Full Screen

1MobileBy.ByIosNsPredicate iosNsPredicate = new MobileBy.ByIosNsPredicate("name CONTAINS 'test'");2WebElement element = driver.findElement(iosNsPredicate);3appium_ns_predicate = Appium::Core::By::IosNsPredicate.new("name CONTAINS 'test'")4element = @@driver.find_element(appium_ns_predicate)5var iosNsPredicate = By.IosNsPredicate("name CONTAINS 'test'")6var element = driver.findElement(iosNsPredicate)7var iosNsPredicate = By.IosNsPredicate("name CONTAINS 'test'");8var element = driver.FindElement(iosNsPredicate);9$iosNsPredicate = By::IosNsPredicate("name CONTAINS 'test'");10$element = $driver->findElement($iosNsPredicate);11ios_ns_predicate = By.IosNsPredicate("name CONTAINS 'test'")12element = driver.find_element(ios_ns_predicate)13ios_ns_predicate = By.IosNsPredicate("name CONTAINS 'test'")14element = driver.find_element(ios_ns_predicate)15my $ios_ns_predicate = By::IosNsPredicate("name CONTAINS 'test'");16my $element = $driver->find_element($ios_ns_predicate);17iosNsPredicate := By.IosNsPredicate("name CONTAINS 'test'")18element := driver.FindElement(iosNsPredicate)

Full Screen

Full Screen

MobileBy.ByIosNsPredicate

Using AI Code Generation

copy

Full Screen

1MobileElement element = (MobileElement) driver.findElementByIosNsPredicate("name == 'Continue'");2MobileElement element = (MobileElement) driver.findElementByIosUIAutomation(".elements()[0]");3MobileElement element = (MobileElement) driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Continue\")");4element = driver.find_element_by_ios_ns_predicate("name == 'Continue'")5element = driver.find_element_by_ios_uiautomation(".elements()[0]")6element = driver.find_element_by_android_uiautomator("new UiSelector().text(\"Continue\")")7element = driver.find_element :ios_uiautomation, ".elements()[0]"8element = driver.find_element :android_uiautomator, "new UiSelector().text(\"Continue\")"

Full Screen

Full Screen

MobileBy.ByIosNsPredicate

Using AI Code Generation

copy

Full Screen

1 .predicateWithFormat("value = 'Some value' AND label = 'Some label' AND name = 'Some name'");2 .automationWithPredicate("value = 'Some value' AND label = 'Some label' AND name = 'Some name'");3 .accessibilityId("Some value");4 .uiAutomator("new UiSelector().text(\"Some value\")");5 .viewTag("Some value");6 .dataMatcher("Some value");7 .viewMatcher("Some value");8 .androidClass("Some value");9 .androidText("Some value");10 .androidContentDesc("Some value");

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.

Most used methods in MobileBy.ByIosNsPredicate

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful