如何向下滚动以使用appium和java单击Android中的元素?

时间:2017-10-03 17:47:41

标签: java android scroll automation appium

我想知道如何向下滚动以使用appium和java单击Android中的元素?

我在“android.support.v7.widget.RecyclerView”中有一个元素列表。由于它有10个以上的元素,我们需要滑动屏幕才能看到下面的元素。 每个元素都具有相同的id,即“com.osanda.exampleapp/textViewTitle”。但他们的文字不同,如“Apple”,“Orange”,“Grapes”......

我只需要滚动并点击相关元素的文字(“Apple”,“Orange”,“Grapes”.....)

我已经遵循了许多教程但无法正确完成。我设法向下滚动屏幕。但是当元素位于滚动的中间位置时它将不起作用。

当我列出元素名称时,它只显示可见元素,而不是所有元素。

List<WebElement> elements = androidDriver.findElementByClassName("android.support.v7.widget.RecyclerView").findElements(By.id("com.osanda.exampleapp:id/textViewTitle"));
        for(WebElement element : elements) {
            System.out.println(element.getText());
        }

谢谢。

7 个答案:

答案 0 :(得分:5)

这对我有用。

public void scrollAndClick(String visibleText) {
     androidDriver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().textContains(\""+visibleText+"\").instance(0))").click();
        }
    }

答案 1 :(得分:2)

请使用以下代码。它将滚动直到文本可见。

   String uiSelector = "new UiSelector().textMatches(\"" + text
                        + "\")";

   String command = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView("
                        + uiSelector + ");";

    driver.findElementByAndroidUIAutomator(command);

现在您可以在此之后执行点击操作。

答案 2 :(得分:2)

在新版本的Appium中,您可以使用此功能:

TouchActions action = new TouchActions(driver);
action.scroll(element, 10, 100);
action.perform();
element.click();

答案 3 :(得分:0)

SELECT u.first_name, u.last_name, u.id, ud.profile_pic, c.*,cm.* FROM chat_master cm LEFT JOIN chat c ON c.thread_id=cm.thread_id LEFT JOIN users u ON u.id = cm.msg_to_id LEFT JOIN user_details ud ON ud.id = u.id WHERE cm.msg_from_id='$myID' GROUP BY c.thread_id ORDER BY c.datentime DESC 在最新版本中已贬值,

正在运行的代码现在看起来像

findElementByAndroidUIAutomator--AndroidUiAutomater

答案 4 :(得分:0)

public AndroidElement ScrollToElement(String by, String using) {
    AndroidElement element = null;
    int numberOfTimes = 10;
    Dimension size = driver.manage().window().getSize();
    int anchor = (int) (size.width / 2);
    // Swipe up to scroll down
    int startPoint = (int) (size.height - 10);
    int endPoint = 10;

    for (int i = 0; i < numberOfTimes; i++) {
        try {
            new TouchAction(driver)
                .longPress(point(anchor, startPoint))
                .moveTo(point(anchor, endPoint))
                .release()
                .perform();
            element = (AndroidElement) driver.findElement(by, using);
            i = numberOfTimes;
        } catch (NoSuchElementException ex) {
            System.out.println(String.format("Element not available. Scrolling (%s) times...", i + 1));
        }
    }
    return element;
}

在测试中的用法如下: 示例: String usingWebView = “//android.widget.TextView[@text=‘Spinner’]”; String by = “xpath”; MobileActions mbAct = new MobileActions(driver); //This is just a class which has above function code. AndroidElement webViewElement = mbAct.ScrollToElement(by, usingWebView, 250); webViewElement.click();

答案 5 :(得分:0)

使用下面的while循环,通过在屏幕上向下滑动直到出现期望的元素来查找包含的内容

    While (driver.findElements(By.id(“id”)).size()==0){
size = driver.manage().window().getSize();
int starty = (int) (size.height * 0.80);
int endy = (int) (size.height * 0.20);
int startx = size.width / 2;
System.out.println("starty = " + starty + " ,endy = " + endy + " , startx = " + startx);

driver.swipe(startx, starty, startx, endy, 3000);
Thread.sleep(2000);
driver.swipe(startx, endy, startx, starty, 3000);
Thread.sleep(2000);
}

一旦退出时检测到您的元素,您就可以执行操作。

答案 6 :(得分:0)

这对我有用,当文本可见时滚动将停止。这里我的文字是:“进度条”,只需根据您的文字替换即可。它会起作用。

String scrollElement = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text(\"Progress Bar\").instance(0))";

driver.findElementByAndroidUIAutomator(scrollElement).click();