【问题标题】:Can't click on element in a cell that is not displayed in Appium - IOS using Java-Client无法单击 Appium 中未显示的单元格中的元素 - IOS 使用 Java-Client
【发布时间】:2019-02-16 21:17:18
【问题描述】:

我正在尝试为我们构建的 SDK 创建自动化 E2E 测试。 我们决定使用测试应用程序来测试 SDK,该应用程序将调用表中的命令来测试所有 SDK 功能。

我被卡住了一段时间,不明白为什么有些点击事件有效而有些无效。

我已经弄清楚了,这是因为正在工作的那些是可见的,而那些不工作的是不可见的(直到在需要可见时创建单元格才真正存在?)。无论如何,这是我的想法或希望,因为如果不是,我真的不明白发生了什么。

有效的代码示例:

@Test
public void step2_resetToken() throws InterruptedException {
    int count = 0;
    String s;
    do {
        MobileElement mElement = (MobileElement) iosDriver.findElement(By.name("Reset Token"));
        mElement.click();
        Thread.sleep(500);
        count++;
        assert count < TIMEOUTTIME;
        s = element.getText();
        System.out.println(s);
    } while(!(element.getText().contains("reset token performed:")));
}

无效的代码示例:

@Test
public void step3_isAuthenticatedByPIN() throws InterruptedException {
    WebElement tableView = (WebElement) iosDriver.findElementByClassName("XCUIElementTypeTable");
    tableView.scrollTo("isAuthenticatedByPIN").click();
    int count = 0;
    String s;
    do {
        ////XCUIElementTypeStaticText[@name="isAuthenticatedByPIN"]
        MobileElement mElement = (MobileElement) iosDriver.findElementByClassName("XCUIElementTypeTable");
        mElement.sendKeys("isAuthenticatedByPIN");
        mElement.findElement(By.name("isAuthenticatedByPIN"));
        mElement.click();

        Thread.sleep(500);
        count++;
        assert count < TIMEOUTTIME;
        s = element.getText();
        System.out.println(s);
    } while(!(element.getText().contains("isAuthenticatedByPIN: YES")));
}

我之前也尝试过调用这个方法,所以会有一个滚动,但它似乎找不到应用启动时不可见的元素:

 public static void scrolltoXPath(RemoteWebDriver driver, String xPath) {

    RemoteWebElement parent = (RemoteWebElement)driver.findElement(By.className("XCUIElementTypeTable"));
    String parentID = parent.getId();
    HashMap<String, String> scrollObject = new HashMap<String, String>();
    scrollObject.put("element", parentID);
    scrollObject.put("name", "isConnected");
    driver.executeScript("mobile:scroll", scrollObject);
}

这是一个尝试使用 scrollTo 的测试,但 Java 客户端无法识别 scrollTo(这是 Java 还是 Javascript 方法)。我也尝试了在谷歌中找到的所有其他方法,但无法弄清楚。

  1. 谁能告诉我关于我无法点击未显示的单元格的结论是否正确?
  2. 如果是这样,请帮助了解如何滚动到我需要单击的单元格。

谢谢。

【问题讨论】:

    标签: appium appium-ios java-client appium-desktop


    【解决方案1】:

    您不能点击屏幕中未显示的元素。

    您需要滚动到该元素才能单击该元素。您可以以各种方式滚动。您可以使用坐标滚动。您还可以使用 text、id、cont-desc 等滚动。

    使用坐标滑动屏幕

    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();
    

    使用 cont-desc 滚动屏幕

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

    有关appium滚动策略的更多信息,请关注this tutorial

    【讨论】:

    • 在我看来这似乎是 Android 唯一的解决方案?正如我所写的,我需要似乎更复杂的 IOS 解决方案,相信我,当我阅读每篇文章试图在 IOS 上解决这个问题时,我之前也阅读过教程,但它只是 android ......在我看来像 IOS 一样,关于 Appium 的知识较少。
    • 我不知道为什么 IOS 的解决方案会有所不同。这是一个 Appium 问题。也许您看到的示例显示了 Android 定位器,但想法应该是相同的。我相信 IOS 设备同样只在其文档模型中提供在任何给定时间可见的项目。由于您可以使用 Appium 进行滚动,而无需使用类似滑动的动作显示的元素类型,因此应该没有问题。记下屏幕网格中显示的最后一项,滚动直到您的项目可见或最后一项未更改。
    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2019-04-22
    • 1970-01-01
    • 2016-08-23
    • 2014-04-13
    相关资源
    最近更新 更多