Android上的Appium - 报告的屏幕尺寸与实际屏幕尺寸不同

时间:2015-03-19 12:30:48

标签: android appium

我在游戏中使用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只是报告屏幕尺寸小于实际尺寸。

有没有其他人遇到这个?有解决方法吗?

5 个答案:

答案 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 answerthis answer合并,则非常接近于解释您缺少的74个像素:

  • 高密度屏幕的高度为38dip(HIGH_DPI_STATUS_BAR_HEIGHT = 38)。
  • 您可以通过乘以2(对于xhdpi密度屏幕)将“dip”值转换为像素。 76像素听起来非常接近!

答案 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();