import XCTest final class SelectionMenuTests: XCTestCase { private let app = XCUIApplication() override func setUpWithError() throws { continueAfterFailure = false } func testSelectionMenuShowsCopyOption() throws { app.launchAndOpenSampleBook() app.waitForReader(timeout: 12) let selectionText = app.otherElements[IDs.readerSelectionText].firstMatch guard selectionText.waitForExistence(timeout: 5) else { throw XCTSkip("文本选区元素不存在") } let start = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.3, dy: 0.5)) let end = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.5)) start.press(forDuration: 0.8, thenDragTo: end) XCTAssertTrue(app.menuItems["拷贝"].waitForExistence(timeout: 3), "选区菜单应包含拷贝选项") } func testSelectionMenuShowsAnnotateOption() throws { app.launchAndOpenSampleBook() app.waitForReader(timeout: 12) let selectionText = app.otherElements[IDs.readerSelectionText].firstMatch guard selectionText.waitForExistence(timeout: 5) else { throw XCTSkip("文本选区元素不存在") } let start = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.3, dy: 0.5)) let end = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.5)) start.press(forDuration: 0.8, thenDragTo: end) XCTAssertTrue(app.menuItems["批注"].waitForExistence(timeout: 3), "选区菜单应包含批注选项") } func testTapBlankAreaClearsSelection() throws { app.launchAndOpenSampleBook() app.waitForReader(timeout: 12) let selectionText = app.otherElements[IDs.readerSelectionText].firstMatch guard selectionText.waitForExistence(timeout: 5) else { throw XCTSkip("文本选区元素不存在") } let start = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.3, dy: 0.5)) let end = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.5)) start.press(forDuration: 0.8, thenDragTo: end) XCTAssertTrue(app.menuItems["拷贝"].waitForExistence(timeout: 3), "选区菜单应出现") let contentArea = app.otherElements[IDs.readerContentView].firstMatch if contentArea.waitForExistence(timeout: 3) { contentArea.coordinate(withNormalizedOffset: CGVector(dx: 0.1, dy: 0.1)).tap() } let menuGone = !app.menuItems["拷贝"].waitForExistence(timeout: 2) XCTAssertTrue(menuGone, "点击空白区域后选区菜单应消失") } func testCopySelectedText() throws { app.launchAndOpenSampleBook() app.waitForReader(timeout: 12) let selectionText = app.otherElements[IDs.readerSelectionText].firstMatch guard selectionText.waitForExistence(timeout: 5) else { throw XCTSkip("文本选区元素不存在") } let start = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.3, dy: 0.5)) let end = selectionText.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.5)) start.press(forDuration: 0.8, thenDragTo: end) let copyMenuItem = app.menuItems["拷贝"] if copyMenuItem.waitForExistence(timeout: 3) { copyMenuItem.tap() } app.waitForDemoReaderState(timeout: 5, description: "reader=opened") { $0.isOpened } } }