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

#flutter #appium

#flutter #appium

Вопрос:

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

Ответ №1:

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

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

Затем в Selenium 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
    }

  

Комментарии:

1. Может быть полезно для определенных сценариев, но я бы держался подальше от этого подхода. Это полностью свернет ваши тесты в тот момент, когда вы измените какой-либо стиль макетов.

Ответ №2:

До сегодняшнего утра я ничего не знал о Flutter. Прошло несколько часов, и я могу с уверенностью сказать «вы этого не делаете». Хотя Flutter делает разработку приложения быстрой и легкой, он лишает вас значительной части контроля, включая требуемый уровень настройки.

На официальных досках объявлений Flutter, датируемых годом или двумя, были обращения по этому поводу, но ответов не было.

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