Невозможно щелкнуть элемент в ячейке, которая не отображается в Appium — IOS с использованием Java-клиента

Я пытаюсь создать автоматизированное E2E-тестирование для SDK, который мы создаем. Мы решили протестировать 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). Также я пробовал все другие методы, которые нашел в Google, и не смог понять это.

  1. Кто-нибудь может сказать мне, прав ли я в выводе, что я не могу щелкнуть ячейку, которая не отображается?
  2. Если это так, пожалуйста, помогите с тем, как перейти к ячейке, на которую мне нужно нажать.

Спасибо.


person Erez    schedule 12.09.2018    source источник


Ответы (1)


Вы не можете нажать на элемент, который не отображается на экране.

Вам нужно прокрутить до элемента, прежде чем вы сможете щелкнуть этот элемент. Вы можете прокручивать различными способами. Вы можете прокручивать, используя координаты. Вы также можете прокручивать текст, 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 следуйте этому руководству

person Suban Dhyako    schedule 13.09.2018
comment
Мне кажется, это решение только для Android? Как я уже писал, мне нужно решение для IOS, которое кажется более сложным. Поверьте мне, что, читая каждую статью, пытаясь решить эту проблему на IOS, я также читал учебник раньше, но это только для Android... Мне кажется как и для IOS, меньше знаний о Appium. - person Erez; 13.09.2018
comment
Я не знаю, почему решение для IOS будет другим. Это проблема Appium. Возможно, примеры, которые вы видите, показывают локаторы Android, но идея должна быть той же. Я считаю, что устройства IOS также делают доступными в своей модели документа только те элементы, которые видны в любой момент времени. Поскольку вы можете прокручивать с помощью Appium независимо от типов элементов, отображаемых с помощью движений, подобных смахиванию, проблем быть не должно. Обратите внимание на последний элемент, отображаемый в сетке на экране, прокручивайте до тех пор, пока ваш элемент не станет видимым или последний элемент не изменится. - person Bill Hileman; 13.09.2018