Не удается щелкнуть элемент в ячейке, которая не отображается в Appium - IOS с использованием Java-клиента - PullRequest
0 голосов
/ 12 сентября 2018

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

Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

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

Вам нужно прокрутить до элемента, прежде чем вы сможете щелкнуть по этому элементу. Вы можете прокрутить по-разному. Вы можете прокручивать, используя координаты. Вы также можете прокручивать, используя текст, идентификатор, продолжение и т. Д.

Проведите по экрану с помощью координат

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 следуйте этому руководству

...