无法使用Appium Selenium Android滚动ListView内的元素

时间:2018-09-02 06:31:35

标签: selenium listview appium horizontalscrollview

几天来,我试图找到一种在列表视图中滚动的简单解决方案

由于Appium Inspector没有提供列表的所有元素(只能通过手动滑动并刷新检查器,然后加载具有新实例的新元素。

经过研究,我发现列表项之间的距离如下:

Item Location= (15, 828)
Item Location= (15, 1209)
Item Location= (15, 1590)

因此,我想每次单击都需要向下滚动381像素,经过这么多次尝试后,我找不到这部分代码的解决方案,如果有人可以提供帮助,我会很高兴:

List<WebElement> list = driver.findElements(By.id("net.balink.diplomat.qa:id/btnAddToCart"));
System.out.println("List Size is= " + list.size());

for (int j = 0; j < list.size(); j++) {
    WebElement listItem = list.get(j);
    Point location = listItem.getLocation();
    System.out.println("Location= " + location);
    listItem.click();

    //to do here: swipe 381 px down after any click, then re-initialize 
    //the listItem in order to get a new index - and the loop when 
    //theres no more list items

    Thread.sleep(2000);
}

2 个答案:

答案 0 :(得分:2)

我正在使用以下方法滚动屏幕:

public static MobileElement scrollElementByContentDesc(String scrollableList, String uiSelector, String textToSearchInList) {
        return driver.findElement(MobileBy.AndroidUIAutomator(
                "new UiScrollable(new UiSelector().resourceId(\"" + scrollableList + "\")).getChildByDescription("
                        + "new UiSelector().className(\"" + uiSelector + "\"), \"" + textToSearchInList+ "\")"));

    }

scrollableList 是可滚动List元素的ID,

uiSelector 是列表项的className,

textToSearchInList 可以是您需要在列表中搜索的任何文本。如果您的目的只是滚动到列表的末尾,则可以是任何随机文本。

从任何方法中调用此方法:

public void someMethod(){
//other code
try{
    MobileElement element= scrollElementByContentDesc("your scrollableList id",
                "uiSelector classname", "any text you need to find in the list);
}catch(Exception e){
    //do nothing
}
}

如果要按co0rdinate滑动,可以这样做。

import io.appium.java_client.TouchAction;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;
import java.util.concurrent.TimeUnit;
import static java.time.Duration.ofSeconds;

TouchAction action = new TouchAction(driver); 
action.press(PointOption.point(115, 650)).waitAction(WaitOptions.waitOptions(ofSeconds(1)))
                .moveTo(PointOption.point(115, 350)).release().perform();
  

确保导入正确的库。

答案 1 :(得分:1)

更可靠的方法是使用本机UiAutomator方式:

因此,首先找到具有scrollable: true属性的列表元素的父视图。那肯定应该至少是一个。

然后使用检查器来构建和测试您的UiAutomator定位器

MobileElement elementScrollTo = driver
            .findElementByAndroidUIAutomator("new UiScrollable(new UiSelector()"
            + ".resourceId(\"android:id/list\")).scrollIntoView("
            + "new UiSelector().text(\"Some text\"));");

UiSelector具有非常丰富的API,请检查并找到最适合您的内容。

此方法比TouchActions更好,因为您不依赖于设备屏幕分辨率/坐标。