Как добавить селекторы / идентификаторы в виджеты Flutter, чтобы к ним можно было получить доступ из Appium

Мы хотим использовать Appium/Selenium для автоматического тестирования приложения Flutter. Некоторые элементы не имеют селекторов при просмотре в Selenium. В Android мы просто добавляем идентификаторы на каждый элемент, и они появляются в Appium. Как мы делаем это в трепетной среде?

1 ответ

До этого утра я ничего не знал о Флаттере. Несколько часов спустя, и я смело могу сказать: "Вы не делаете". Несмотря на то, что Flutter делает разработку приложений быстрой и простой, она избавляет вас от множества элементов управления, в том числе от уровня настройки, который вы ищете.

На официальных досках объявлений Flutter, появившихся год или два назад, есть хиты, но ответов не было.

Вы могли бы попытаться найти все по тексту? Клюге, трудно или невозможно поддерживать, но, вероятно, ваш единственный вариант на данный момент.

Я нашел подход с обходным путем, который затем позволяет вам достаточно естественно использовать Selenium с Flutter Web (хотя и не работает с браузером без головы)

  1. Вам нужно найти смещение координат x y окна от координат x y экрана. Я нашел эту идею в другой веткеpageCallibrator.html:
<script>
window.coordinates = [];
document.addEventListener('click', function() {
     window.coordinates = [event.pageX, event.pageY]; 
});
</script>

Затем в Селене setup перед запуском тестов (пример Java)

    int windowScreenOffsetX = 0;
    int windowScreenOffsetY = 0;

    void callibrateXY(WebDriver driver) {
        driver.get("http://localhost:8080/pageCallibrator.html"); //TODO adjust host
        Dimension size = driver.manage().window().getSize();

        int x = size.width / 2;
        int y = size.height / 2;
        clickMouseAtXY(x, y);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
        }
        List<Object> coordinates = (List<Object>) ((JavascriptExecutor) driver).executeScript("return window.coordinates;");
        windowScreenOffsetX = x - (int) (long) coordinates.get(0);
        windowScreenOffsetY = y - (int) (long) coordinates.get(1);
    }

Теперь в Selenium нажать кнопку Flutter

            WebElement continueToBankButtonElement = findElementWithText(driver, "My button text");
            clickMouseAtElement(continueToBankButtonElement);

где вы определяете

import org.openqa.selenium.*

    Robot robot = new Robot();
    Driver driver = new ChromeDriver(options); // TODO handler exceptions and options in a method


    WebElement findElementWithText(WebDriver driver, String text) {
        return driver.findElement(containsTextLocator(text));
    }

    By containsTextLocator(String text) {
        return By.xpath("//*[contains(text(), '" + text + "')]");
    }

    void clickMouseAtElement(WebElement element) {
        clickMouseAtXY(element.getLocation().getX() + element.getSize().width / 2, element.getLocation().getY() + element.getSize().height / 2);
    }

    void clickMouseAtXY(int x, int y) {
        moveMouse(x, y);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * @param x
     * @param y
     */
    protected void moveMouse(int x, int y) {
        robot.mouseMove(x + windowScreenOffsetX, y + windowScreenOffsetY); // Offset of page from screen
    }

Другие вопросы по тегам