打开 url 外部浏览器时是不是可以测试 uitest (XCUI)?

Posted

技术标签:

【中文标题】打开 url 外部浏览器时是不是可以测试 uitest (XCUI)?【英文标题】:Is it possible to testing uitest (XCUI) when open url external browser?打开 url 外部浏览器时是否可以测试 uitest (XCUI)? 【发布时间】:2020-10-22 03:54:35 【问题描述】:

目前,我必须使用 XCUI 创建自动化 ui 测试,并且我有一些操作可以默认打开外部浏览器是 Safari。

我需要像这样创建一些 uitest 的行为。

    单击我的按钮时转到外部浏览器。 检查是否在浏览器中打开了正确的 url(或只是打开浏览器)? 以恢复状态返回我们的应用。

这不可能吗?

【问题讨论】:

我认为您不需要测试它是否会真正打开外部应用程序,因为这不是您可以通过应用程序控制的。但是,您可以使用协议抽象测试 UIApplication.canOpenUrl()UIApplication.open(...) 是否被触发。 感谢您的评论@Ben,但我的质量保证需要它。 T_T 我的意思是,测试在 ios 上正确打开 web url 并使用匹配的 url 打开 Safari 将是 Safari 开发团队的测试。这就是为什么我提到使用带有 open()canOpenUrl() 的协议来填补空白,假设 Safari 将始终按预期运行。 【参考方案1】:

当然。 Safari 是一个 XCUIApplication ,就像任何其他具有 com.apple.mobilesafari 包标识符的其他应用程序一样。

要检查 URL,您将 tap()URL 字段(页面加载时它是一个按钮)并读取 URL 字段的值(此时它是一个文本字段)。一旦你完成断言,activate() 你的应用程序,你就会回到它(注意:我的测试在断言后完成,所以我不必这样做,但它是已发布的方法 - 你总是可以进入调试并找到如何点击按钮以返回屏幕左上角的应用程序(如果这不起作用)。

如果您告诉我您已经尝试过但无法使其正常工作,我很乐意提供准确的代码,但这是非常简单的 XCUI 自动化。

【讨论】:

作为对此的跟进,我发现这有点不稳定。 XCUITest 有时会工作得如此之快,以至于它会在页面加载之前尝试读取 URL(我可能会或可能不会处理重定向 - 不记得了)。为了解决这个问题,当在 URL 按钮的 otherElements.firstMatch 中不再找到 % 符号时,我设置了一个等待/计时器过期(它是隐藏在可访问性中的加载指示器)。 我们最近开始在我们的应用程序中使用内联浏览器,它没有 URL 栏,所以这个解决方案不起作用。我会提供一个新的答案。【参考方案2】:

提供对我有用的确切代码

     enum SafariError: Error 
          case appLoadTimeout
     
    
    let safari = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari")
    app.buttons["MyButtom"].tap() // MyButton launches Safari
    
    guard safari.wait(for: .runningForeground, timeout: 5) else 
        throw SafariError.appLoadTimeout
    
    
    safari.otherElements["Address"].tap()
    XCTAssertEqual(safari.textFields["Address"].value  as! String, "https://check-url.com")

    app.activate() //Back to my app

【讨论】:

您是如何处理加载缓慢的页面的? 50% 的时间我发现 Safari 在前台运行后处理速度太快,以至于地址无法包含我期望的内容。我有两个解决方案,但很好奇你是怎么做的,或者这对你来说不是问题。 对我来说没有问题,测试成功,我想这可能是我在Safari中添加等待方法的原因【参考方案3】:

前面的答案适用于外部浏览器。如果您的应用碰巧启动了内联浏览器,它们将无法工作,因为没有 URL 栏。您可以检测到内联浏览器并在检查 URL 之前点击 Safari 按钮从外部启动它,但是您必须重新激活您的应用程序并关闭内联浏览器。更多步骤。

有一种更简单的方法可以用于两种浏览器类型!

这些浏览器共享什么?分享按钮!我们如何从那里获取 URL? Copy 会将 URL 放在我们可以访问的粘贴板中。

 app.buttons["ShareButton"].tap()
 _ = copyButton.waitForExistence(timeout: Waits.short.rawValue) // a tiny wait is necessary here for the share page to open fully
 app.buttons["Copy"].tap()
 let URL = UIPasteboard.general.string!

这里有两个问题:

    内联时,app 是您的应用程序。在外部时,它是com.apple.mobilesafari。你必须有逻辑来处理它。 您想等待页面完成加载。如果不这样做,你会遇到片状。页面加载时,有一个ReloadButton。当这种情况消失时,您应该会看到StopButton。如果重新加载按钮没有消失,则页面没有完全加载,因此您可能需要点击停止按钮,但请以安全的方式进行,因为我看到页面加载完成的时间可能只有 1% 毫秒在放弃它和执行点击之间 - 我在点击之前快速检查isHittable

【讨论】:

以上是关于打开 url 外部浏览器时是不是可以测试 uitest (XCUI)?的主要内容,如果未能解决你的问题,请参考以下文章

从外部 url 打开已安装的 PWA

单击 URL 会打开默认浏览器

Android WebView是否需要打开外部URL的权限?

Cordova 应用程序在启动时打开一个外部 URL

微信中打开链接,自动打开外部浏览器打开指定URL页面用VJump来实现

Phonegap ChildBrowser 通过自定义 iOS url 打开外部 URL