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!
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")
4条答案
按热度按时间9bfwbjaz1#
提供准确的代码,这对我很有效
oyjwcjzk2#
当然。Safari是一个XCUIApplication,就像任何其他包标识符为
com.apple.mobilesafari
的应用程序一样。要检查URL,您将
tap()
URL
字段(页面加载时它是一个按钮)并读取URL
字段的值(此时它是一个textField)。一旦你完成Assert,activate()
你的应用程序,你会回到它(注意:我的测试在Assert后完成,所以我不必这样做,但它是发布的方法-你可以随时进入debug并找到如何点击按钮返回到屏幕左上角的应用程序,如果这不起作用)。我很乐意提供确切的代码,如果你告诉我你已经尝试过了,不能让它工作,但它是非常简单的XCUI自动化。
6rvt4ljy3#
前面的答案适用于外部浏览器。如果您的应用程序碰巧启动内联浏览器,它们将无法工作,因为没有URL栏。您可以检测内联浏览器并点击Safari按钮在外部启动它,然后检查URL,但之后您必须重新激活应用并关闭内联浏览器。更多的步骤。
有一个更简单的方法,将工作与两种浏览器类型!
这些浏览器有什么共同点?分享按钮!如何从那里获取URL?
Copy
将把URL放在我们可以访问的粘贴板中。这里有两个陷阱:
1.内联时,
app
就是你的应用。如果是外部的,它是com.apple.mobilesafari
。你得有逻辑来处理。1.您希望等待页面加载完成。如果不这样做,你会陷入分裂。当页面加载时,有一个
ReloadButton
。当它消失时,您应该会看到StopButton
。如果重新加载按钮没有消失,页面没有完全加载,所以你可能需要点击停止按钮,但这样做是安全的,因为我看到在放弃它和执行点击之间的毫秒内,页面加载完成的时间可能只有1%-我在点击之前做了一个快速的isHittable
检查。aiazj4mn4#
您可以通过捕获Safari应用程序并在其地址栏中验证您的URL来实现这一点,只需两个步骤。假设测试的URL是
https://myapp.com/something
,下面是如何测试它是否在Safari中打开:这里发生的是,一旦应用程序在Safari中打开链接,它就会尝试从地址栏读取目标URL,点击它以便能够读取其文本字段内容,最后根据地址栏的值Assert预期的URL字符串。
这种方法更稳定,因为它直接检查浏览器内所有文本字段的值,而不是引用它们的
identifier
,例如,检查“地址”标识符今天将不起作用,因为它不再存在于Safari视图层次结构中。请注意,这是针对iOS实际状态的工作解决方案,未来可能会出现破坏性更改。