我们想使用Appium / Selenium对Flutter应用程序进行自动化测试。在Selenium中查看时,某些元素没有选择器。在Android中,我们只需将id添加到每个元素上,它们就会出现在Appium中。我们如何在动荡的环境中做到这一点?
答案 0 :(得分:1)
今天早上之前,我对Flutter一无所知。几个小时后,我可以放心地说“你不要”。 Flutter使开发应用程序变得轻松快捷,但它消除了您拥有的许多控制权,包括您要查找的自定义级别。
在Flutter官方留言板上有一两年之久的热门搜索,但没有答案。
您可以尝试通过文本查找所有内容吗? Kluge,难以维护或无法维护,但目前可能是您唯一的选择。
答案 1 :(得分:0)
我找到了一种具有解决方法的方法,该方法可让您合理地在Flutter Web中自然使用Selenium(尽管不适用于无头浏览器)
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
}