Использование driver.switchTo (). ActiveElement () в качестве сравнения двух представлений не совпадает даже при попадании на виджет / границу веб-страницы - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь добавить метод в свой класс смахивания (как часть моего базового макета), где он будет пытаться определить, является ли нужный элемент видимым, основываясь на количестве попыток смахивания. Если во время поиска свайп встречается с краем (например, снизу веб-страницы (для WebView) / виджетом (для NativeView,), то он проводит пальцем в другом направлении, чтобы продолжить поиск.

Редактировать : я попытался решить эту проблему, создав два MobileElement, назначив один элемент с помощью: driver.switchTo().activeElement() в качестве текущего представления, а второй MobileElement назначил в качестве предыдущего представления после каждого пролистывания. Однако, когда я достигаю нижней части веб-страницы / виджета, мой код показывает мне, что предыдущий и текущий вид не совпадают.

Из моих исследований по определению границ виджетов во время прокрутки, это было решением, которое другие предоставили без необходимости получать доступ к размерам браузера / виджета через класс View.

Я неправильно понимаю использование switchTo (). ActiveElement ()? Существуют ли альтернативы, помогающие решать индикаторы при достижении границы?

Я пытался выполнить отладку на Appium Server и искал поведение, при котором была достигнута граница, но журналы не показывают никакой информации из моих свайпов, когда она достигает края. (Тем не менее, поведение для прокрутки записывается.)

Редактировать: В своих тестах я использовал Результаты поиска Google в качестве объекта для проверки, если обнаружена граница. AutomationName при настройке моего AppiumDriver - UIAutomator2.

Вот фрагменты кода, которые определяют мой класс смахивания:

Сам метод смахивания:

  void swipeVertical(double startPercentage, double finalPercentage, int duration) {
    driver.context(nativeContext);
    size = driver.manage().window().getSize();
    int width = (int) (size.width/2);
    int startPoint = (int) (size.getHeight() * startPercentage);
    int endPoint = (int) (size.getHeight() * finalPercentage);
    new AndroidTouchAction(driver)
        .press(PointOption.point(width, startPoint))
        .waitAction(WaitOptions.waitOptions(Duration.ofMillis(duration)))
        .moveTo(PointOption.point(width, endPoint))
        .release()
        .perform();
    driver.context(defaultContext);

}

Редактировать : Это метод, в котором я планирую включить другой метод в цикл while, чтобы проверить, видна ли в настоящее время веб-страница / виджет: (Я предпринял попытки сделать сравнение с помощью toString () , toJson (), hashCodes () и getLocation (). Ни одно из этих решений до сих пор не работало для обнаружения изменений вида при свипах.

  void swipeUntilFound(By method, int attempts, MobileElement targetElement) {
    int limitCount = 0;
    double startScrollPoint = 0.8;
    double endScrollPoint = 0.25;

    MobileElement lastViewPoint = null;
    MobileElement currentViewPoint;

    int lastViewPointPosition = 0;

    while (limitCount < attempts || driver.findElements(method).isEmpty()) {
        if(lastViewPoint != null) {
            lastViewPointPosition = lastViewPoint.getLocation().getY();
        }
        swipeVertical(startScrollPoint, endScrollPoint, 3000);
        currentViewPoint = (MobileElement) driver.switchTo().activeElement();
        try {
        System.out.println("last Element in View:  " + lastViewPoint.hashCode() + "Location: " + lastViewPoint.getLocation());
        System.out.println("Current Element in View: " + currentViewPoint.hashCode() + "Location: " + currentViewPoint.getLocation());
        }
        catch (NullPointerException e) {

        }


        if(lastViewPoint == null || lastViewPoint.hashCode() != currentViewPoint.hashCode()) {
            System.out.println("Last and Current don't match.");
            lastViewPoint = currentViewPoint;
        }
        else if( lastViewPointPosition == lastViewPoint.getLocation().getY() ||
                lastViewPoint.hashCode() == currentViewPoint.hashCode()) {
            System.out.println("Last and Current match");
            double temp = startScrollPoint; 
            startScrollPoint = endScrollPoint;
            endScrollPoint = temp;
        }

        limitCount++;
    }
    if(limitCount == attempts) {
        System.out.println("Unable to find Specified Element.");
    }else {
        targetElement = driver.findElement(method);
        System.out.println("Element " + method.toString() + " was found.");
    }
}
...