我们如何向Flutter小部件添加选择器/ ID,以便可以从Appium访问它们

时间:2019-04-03 16:01:41

标签: flutter appium

我们想使用Appium / Selenium对Flutter应用程序进行自动化测试。在Selenium中查看时,某些元素没有选择器。在Android中,我们只需将id添加到每个元素上,它们就会出现在Appium中。我们如何在动荡的环境中做到这一点?

2 个答案:

答案 0 :(得分:1)

今天早上之前,我对Flutter一无所知。几个小时后,我可以放心地说“你不要”。 Flutter使开发应用程序变得轻松快捷,但它消除了您拥有的许多控制权,包括您要查找的自定义级别。

在Flutter官方留言板上有一两年之久的热门搜索,但没有答案。

您可以尝试通过文本查找所有内容吗? Kluge,难以维护或无法维护,但目前可能是您唯一的选择。

答案 1 :(得分:0)

我找到了一种具有解决方法的方法,该方法可让您合理地在Flutter Web中自然使用Selenium(尽管不适用于无头浏览器)

  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);
    }

现在在硒中按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
    }