背景:页面元素无法通过单一属性唯一确定[XPath/id不唯一,........],需要通过组合属性定位
1、组合属性定位
List<MobileElement> lis = new ArrayList<MobileElement>();
MobileElement mobileEle =null;
/* locate elements by className and index */
public List<MobileElement> getElementsByClassNameAndIndex(AndroidDriver driver, String className, int index) {
if (String.valueOf(index) != null) {
lis = driver.findElementsByAndroidUIAutomator( "new UiSelector().className(" + "\"" + className + "\"" + ").index(" + index + ")");
}
return lis;
}
/* locate element by className and text */
public MobileElement getElementByClassAndText(AndroidDriver driver,String classname,String text){
mobileEle = (MobileElement) driver.findElementByAndroidUIAutomator("new UiSelector().className("+"\""+classname+ "\""+").text("+"\""+text+"\""+")");
return mobileEle;
}
/* locate element by className and instance */
public MobileElement getElementByClassnameAndInstance(AndroidDriver driver,String classname,String instance){
mobileEle = (MobileElement) driver.findElementByAndroidUIAutomator("new UiSelector().className("+"\""+classname+ "\""+").instance("+"\""+instance+"\""+")");
return mobileEle;
}
/* locate element by className and index */
public MobileElement getElementByClassnameAndIndex(AndroidDriver driver,String classname,int index){
mobileEle = (MobileElement) driver.findElementByAndroidUIAutomator("new UiSelector().className("+"\""+classname+ "\""+").index("+index+")");
return mobileEle;
}
/* locate elements by className and index and the attribute[clickable] is true*/
public List<MobileElement> getElementsByClassAndIndexAndClickable(AndroidDriver driver,String classname,String index){
lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"\""+classname+ "\""+").index("+index+").clickable(true)");
return lis;
}
2、 滚动页面到指定的元素位置
public static String UiScrollable(String uiSelector) {
return "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" + uiSelector + ".instance(0))";
}
/**
* 滑动到某元素
* @param uiScrollables 符合UiScrollable的string串
* @return
*/
public MobileElement scrollToElement(AndroidDriver driver,String uiScrollables ) {
String uiStr= UiScrollable(uiScrollables );
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return (MobileElement) driver.findElementByAndroidUIAutomator(uiStr);
}
String uiScrollables = "new UiSelector().resourceId(" + "\"" + test_Para.ele_Id_Map().get("tv_number") + "\"" + ")"; // 页面底部含人数的文本元素 [XXX联系人]
MobileElement ele = contextPreparation.scrollToElement(driver, uiScrollables);// 滑动至文本元素
3、等待页面元素完成渲染
/* 设置具体元素等待,完成页面响应[waitTime周期内没一秒发起定位一次] */
public Boolean waitForVisible(WebDriver driver, By by, int waitTime) {
WebDriverWait wait = new WebDriverWait(driver, waitTime);
Boolean flag = false;
for (int attempt = 0; attempt < waitTime; attempt++) {
try {
driver.findElement(by);
flag=true;
break;
} catch (NoSuchElementException e) {
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
flag = false;
// logger.error("execute timeout .");
}
}
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
return flag;
}