gpt4 book ai didi

macos - 如何通过 Xcode UI 测试确定 ScrollView 中文本的哪一部分在屏幕上可见?

转载 作者:行者123 更新时间:2023-12-03 17:09:05 25 4
gpt4 key购买 nike

我是 Xcode 用户界面测试框架的新手。我可以成功地操作屏幕元素,但无法弄清楚如何生成关于 ScrollView 中可见文本的有意义的断言。

我想编写的测试如下:启动应用程序,在 TextView 中输入大量文本(足以使第一行滚动到 View 之外),断言第一行文本不可见,将 View 滚动回顶部,然后断言第一行现在可见。请注意,此测试的目的是确保我的应用程序已正确连接,而不是测试 Apple 的代码。

XCUIApplication 允许我在 NSTextView 实例中输入内容,还允许我滚动关联的 NSScrollView。但是我如何断言第一行文本当前是否可见? XCUIElement 上的 value 属性提供 View 的全部文本内容,无论当前是否显示。

NSTextView 上的accessibilityRange(forLine:) 和accessibilityString(for:) 方法是理想的,但我不知道如何访问它们,因为UI 测试只能访问XCUIElement,而不是底层的NSTextView。

我是否错过了什么,或者有更好的方法来解决这个问题吗?

最佳答案

如果您在 Storyboard或 TextView 的代码中设置了辅助功能标识符,您可以通过以下方式获取 TextView (假设您为其指定了 id“textview1”,并且它所在的窗口具有默认的辅助功能标识符“Window” ):

let textview1TextView = app.windows["Window"].textViews["textview1"]

但这实际上并不能满足您的需要。

相反,设置 ScrollView 的辅助功能标识符并获取:

let scrollview = app.windows["Window"].scrollViews["scrollview1"]

然后用它来获取滚动条(在这种情况下你应该只有一个;你可以使用 scrollbars.count 来检查。

let scrollbars = scrollview.scrollBars
print("scrollbars count: \(scrollbars.count)")

然后你可以使用滚动条的 value 属性来获取它的值:(您将 XCUIElemenTypeQueryProvider 转换为 XCUIElement,以便获取它的值):

let val = scrollbars.element.value

顶部为 0,滚动时为浮点值(我的测试代码中的一行文本显示值为 {{0.02409638554216868}}。

可帮助您进一步探索的文档:

XCUIElementTypeQueryProvider

XCUIElementAttributes

请注意,您可以在测试中间放置一个断点,运行它,然后使用调试器控制台来检查:

(lldb) po scrollbars.element.value
t = 749.66s Find the ScrollBar ▿ Optional<Any>
- some : 0

(lldb) po scrollbars.element.value
t = 758.17s Find the ScrollBar ▿ Optional<Any>
- some : 0.05421686746987952

在调试器中,您甚至可以与应用程序的窗口交互以手动滚动它(这就是我在输入这两个 po 调用之间所做的操作),或者添加文本等。

<小时/>

好的,OP 现在注意到他们对显示或不显示的特定文本感兴趣,而不是查看或不显示第一行(这是我之前在上面回答的)。

这里有一些技巧,但我认为它会起作用:

使用XCUICooperativeclick(forDuration:,thenDragTo:)方法选择第一行文本(使用 View 框架计算坐标),然后使用typeKey(modifierFlags:) 调用编辑菜单“复制”命令。然后使用 NSPasteboard 方法获取粘贴板内容并检查文本。

这是我为验证该方法所做的快速测试(如上所述,使用 XCUICooperative 选择第一行文本留作读者练习):

NSPasteboard.general.clearContents()

// stopped at break point on next line and I manually selected the text of the first line of text in my test app and then hit continue in the debugger

textview1TextView.typeKey("c", modifierFlags:.command)
print( NSPasteboard.general.pasteboardItems?.first?.string(forType: NSPasteboard.PasteboardType.string) ?? "none" );

->“第一行的文本”被打印到控制台。

请注意,您可以将选择滚动到屏幕外,因此在选择后不必滚动,否则您将无法获得所需的答案。

关于macos - 如何通过 Xcode UI 测试确定 ScrollView 中文本的哪一部分在屏幕上可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53380916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com