我在游戏中使用Appium 1.3.2运行一些测试。我试图点击一个元素的右下角,我知道许多设备的坐标,我遇到的问题是Appium报告坐标无效,因为它们在屏幕外。
我检查了Appium使用的大小:
driver.manage().window().getSize()
并注意到,在真正具有960x540分辨率的设备上,报告的窗口大小为886x540。
另外,只需单击右下角,即可在Appium日志中生成以下内容:
[36minfo[39m: [debug] Pushing command to appium work queue ["element:touchDown",{"x":889,"y":473}]
[36minfo[39m: [debug] [BOOTSTRAP] [debug] Got data from client: {"cmd":"action","action":"element:touchDown","params":{"x":889,"y":473}}
[36minfo[39m: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
[36minfo[39m: [debug] [BOOTSTRAP] [debug] Got command action: touchDown
[36minfo[39m: [debug] [BOOTSTRAP] [debug] Display bounds: [0,0][886,540]
[36minfo[39m: [debug] [BOOTSTRAP] [debug] Returning result: {"value":"Coordinate [x=889.0, y=473.0] is outside of element rect: [0,0][886,540]","status":29}
[36minfo[39m: [debug] Responding to client with error: {"status":29,"value":{"message":"The coordinates provided to an interactions operation are invalid.","origValue":"Coordinate [x=889.0, y=473.0] is outside of element rect: [0,0][886,540]"},"sessionId":"8d43efa4-931a-4886-8940-4bd96fea3d07"}
我正在测试的游戏是以全屏模式运行,如果我拍摄截图并检查它,屏幕截图大小为960x540,游戏占据整个屏幕,没有菜单项,也没有任何按钮。
我也看到了与其他分辨率相同的问题,其中Appium只是报告屏幕尺寸小于实际尺寸。
有没有其他人遇到这个?有解决方法吗?
答案 0 :(得分:2)
我正在使用Android Chrome浏览器进行测试,但某种程度上driver.manage().window().getSize()
无效。
所以我采取了以下方法:
JavascriptExecutor js = (JavascriptExecutor) driver;
int width = ((Long) js.executeScript("return window.innerWidth || document.body.clientWidth")).intValue();
LLLogs.getLogger().info("width value calculated is :" + width);
int height = ((Long) js.executeScript("return window.innerHeight || document.body.clientHeight")).intValue();
LLLogs.getLogger().info("height value calculated is :" + height);
Dimension dimension = new Dimension(width, height);
答案 1 :(得分:0)
我确实在不同的Android设备上运行了问题。就我而言,我只是通过在运行时拉动设备的UDID来传递针对该特定设备的不同步骤/测试。
答案 2 :(得分:0)
听起来您报告的屏幕尺寸会排除屏幕顶部的Android状态栏。
如果您将this answer与this answer合并,则非常接近于解释您缺少的74个像素:
HIGH_DPI_STATUS_BAR_HEIGHT = 38
)。 答案 3 :(得分:0)
我已经相当广泛地研究了这一点,似乎从driver.manage().window().getSize()
获得的屏幕尺寸是"可用的"屏幕的一部分,它排除了底部区域,后面,家庭和"显示正在运行的应用程序"按钮是。
例如,我的屏幕高度为1280. driver.manage().window().getSize()
返回1184的高度。我测量了"按钮"屏幕底部的区域高出96像素,与此解释完全一致。
另一方面,状态栏(对于我的设备)是48像素。这不足以解释这种差异。
此外,当您对此示例进行数学运算时,您会看到状态栏是全屏的3.75%(确切地)和"按钮栏"是7.5%(确切地说)。使用屏幕高度为960的这些百分比将返回一个"按钮栏"高度为72像素,屏幕的其余部分为888像素。我希望这些信息能以某种方式帮助你!
答案 4 :(得分:0)
如果这对任何人都有用,请使用以下Java代码从Appium中检索Android状态栏和导航栏的高度:
//get System bars height
JsonParser parser = new JsonParser();
JsonObject jsonObject = (JsonObject) parser.parse(driver.getSystemBars().toString());
JsonObject jsonObject2 = (JsonObject) parser.parse(jsonObject.getAsJsonObject("statusBar").toString());
JsonObject jsonObject3 = (JsonObject) parser.parse(jsonObject.getAsJsonObject("navigationBar").toString());
statusBarHeight = jsonObject2.get("height").getAsInt();
navigationBarHeight = jsonObject3.get("height").getAsInt();