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

dgtucam1  于 2023-06-24  发布在  其他
关注(0)|答案(4)|浏览(122)

目前,我必须使用XCUI创建自动化ui测试,并且我有一些操作打开外部浏览器默认是Safari。
我需要创造一些像这样的用户行为。
1.点击我的按钮时,转到外部浏览器。
1.检查是否在浏览器中打开正确的URL(或只是打开浏览器)?
1.返回到我们的应用程序,并恢复状态。
这是不可能做到的吗?.

9bfwbjaz

9bfwbjaz1#

提供准确的代码,这对我很有效

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
oyjwcjzk

oyjwcjzk2#

当然。Safari是一个XCUIApplication,就像任何其他包标识符为com.apple.mobilesafari的应用程序一样。
要检查URL,您将tap()URL字段(页面加载时它是一个按钮)并读取URL字段的值(此时它是一个textField)。一旦你完成Assert,activate()你的应用程序,你会回到它(注意:我的测试在Assert后完成,所以我不必这样做,但它是发布的方法-你可以随时进入debug并找到如何点击按钮返回到屏幕左上角的应用程序,如果这不起作用)。
我很乐意提供确切的代码,如果你告诉我你已经尝试过了,不能让它工作,但它是非常简单的XCUI自动化。

6rvt4ljy

6rvt4ljy3#

前面的答案适用于外部浏览器。如果您的应用程序碰巧启动内联浏览器,它们将无法工作,因为没有URL栏。您可以检测内联浏览器并点击Safari按钮在外部启动它,然后检查URL,但之后您必须重新激活应用并关闭内联浏览器。更多的步骤。
有一个更简单的方法,将工作与两种浏览器类型!
这些浏览器有什么共同点?分享按钮!如何从那里获取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!

这里有两个陷阱:
1.内联时,app就是你的应用。如果是外部的,它是com.apple.mobilesafari。你得有逻辑来处理。
1.您希望等待页面加载完成。如果不这样做,你会陷入分裂。当页面加载时,有一个ReloadButton。当它消失时,您应该会看到StopButton。如果重新加载按钮没有消失,页面没有完全加载,所以你可能需要点击停止按钮,但这样做是安全的,因为我看到在放弃它和执行点击之间的毫秒内,页面加载完成的时间可能只有1%-我在点击之前做了一个快速的isHittable检查。

aiazj4mn

aiazj4mn4#

您可以通过捕获Safari应用程序并在其地址栏中验证您的URL来实现这一点,只需两个步骤。假设测试的URL是https://myapp.com/something,下面是如何测试它是否在Safari中打开:

let safari = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari")
        guard safari.wait(for: .runningForeground, timeout: 10) else {
            XCTFail("could not open Safari")
            return
        }
        // we use CONTAINS because at first, only the base URL is displayed inside the text field. For example, if the URL is https://myapp.com/something, the value of the address bar would be 'myapp.com'
        let pred = NSPredicate(format: "value CONTAINS[cd] %@", "myapp.com")
        let addressBar = safari.textFields.element(matching: pred)
        // tap is needed to reveal the full URL string inside the address bar
        addressBar.tap()
        
        let textField = safari.textFields.element(matching: pred)
        XCTAssertEqual(textField.value as? String, "https://myapp.com/something")

这里发生的是,一旦应用程序在Safari中打开链接,它就会尝试从地址栏读取目标URL,点击它以便能够读取其文本字段内容,最后根据地址栏的值Assert预期的URL字符串。
这种方法更稳定,因为它直接检查浏览器内所有文本字段的值,而不是引用它们的identifier,例如,检查“地址”标识符今天将不起作用,因为它不再存在于Safari视图层次结构中。
请注意,这是针对iOS实际状态的工作解决方案,未来可能会出现破坏性更改。

相关问题