appium - 如何检查元素在 Appium iOS 中是仅部分可见还是完全可见?

标签 appium appium-ios

我有一个 iOS 应用程序,它在单个页面上有很多输入字段。我想自动执行这些输入,我知道如何滚动到这些元素和所有内容,但我对部分显示的元素有疑问。

有两种情况下部分显示的元素会导致问题:

第一种情况是当另一个元素与背景中的元素重叠时引起的。如果我点击背景中的元素,Appium 会点击重叠元素。这会导致错误的交互,从而导致测试崩溃。函数 isDisplayed() 不可用,因为对于部分显示的元素结果为真,即使只有一两行像素可见。

第二种情况 发生在我使用 sendKeys() 向元素中键入内容时。这将打开 iOS 上的键盘,当我想单击下一个元素时,键盘可能恰好在元素上方,除了元素仍然可见的一些空间,因此 isDisplayed() 返回 true元素。我知道有 hideKeyboard() 选项,但这并不总是可行的,因为显示的键盘必须将隐藏键作为可见键。

对我来说,一个解决方案是我不点击下一个元素,而是点击它下面的元素,但这太丑陋了,应该有更好的解决方案。

我已经尝试计算元素的高度,但在 iOS 中这是不可能的,因为所有元素,即使不在屏幕上,仍然可以在 Appium 中找到,并且始终具有元素的高度。

所以我的问题是如何使用比 isDisplayed() 更可靠的方法检查元素是否完全可见?我更喜欢 Java 的解决方案,但我也可以管理其他语言。

最佳答案

我通过实现一个类 BaseElement 来管理这项任务,该类将 RemoteWebdriver(AppiumWebdriver 的基础)的实例作为“ session ”- 属性。

这个BaseElement类还具有以下属性(这里的RootElement是我想知道它是否完全可见的原始IWebElement):

public virtual bool IsFullyVisible
{
    get
    {
        IWindow wnd = this.Session.Manage().Window;
        Rectangle webViewScreenRect = new Rectangle(wnd.Position, wnd.Size);

        Rectangle elemRect = new Rectangle(this.RootElement.Location, this.RootElement.Size);
        return webViewScreenRect.Contains(elemRect);
    }
}

不幸的是,我在针对嵌入式设备使用代码时遇到了麻烦,该嵌入式设备采用相当旧版本的 chrome 来显示 UI。所以在旧版本的 chrome 上尝试获取 Window 对象时可能会出现问题。如果有人知道更多,我会很高兴听到。

我被要求更清楚地了解 OP 描述的问题的实际解决方案。因此,我尝试再次详细说明该部分:

RemoteWebDriver(也是 AppiumDriver 和 AndroidDriver 的基类)提供了获取 IWindow 对象的机会,该对象使我们能够获取屏幕尺寸。为简单起见,我们使用该信息创建一个 Rectangle 对象。

 IWindow wnd = SomeRemoteWebdriverInstance.Manage().Window;
 Rectangle webViewScreenRect = new Rectangle(wnd.Position, wnd.Size);

然后我们得到我们想要检查可见性的元素的矩形:

Rectangle elemRect = new Rectangle(TheIWebElementInstance.Location, TheIWebElementInstance.Size);

之后我们可以使用矩形的方法来检查元素的矩形是否完全在屏幕的矩形内:

webViewScreenRect.Contains(elemRect);

从而回答了最初的问题。

前面提到的封装只是为了在处理 IWebElements 时始终有这个和其他方法。好吧,人们同样可以想到一种扩展方法或这种机制的其他封装。 如上所述:留意旧系统! 快乐编码

关于appium - 如何检查元素在 Appium iOS 中是仅部分可见还是完全可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724461/

相关文章:

java - 如何处理自动化期间弹出的警报?

appium - 无法获取 uia2_device_port_guard 上的锁。文件已存在

android - 如何使用appium for iOS在移动设备屏幕上进行圆形手势操作

java - 我想从应用程序切换到 chrome 网络浏览器,然后导航回 appium 中的同一应用程序

Appium XCUIElement 在辅助功能 id、值、名称、标签中显示相同的显示文本

java - 由于 xcodebuild 失败 : xcodebuild failed with code 65,无法启动 WebDriverAgent

appium - @iOSFindBy 显示为已弃用,我可以使用什么代替(使用 pagefactory 混合使用 Android 和 iOS 设备))

node.js - 安装appium服务器时出错

android - packageAndLaunchActivityFromManifest 失败 appium 错误

gitlab - 使用 appium 为移动自动化设置 gitlab cicd?