From 55a4959d68c85760c175919c7500a2729d7fd4cc Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 17 Feb 2026 12:30:02 +1300 Subject: [PATCH 1/2] Remove self-hosted site login The app now uses application password authentication (via web view). --- WordPress/UITests/Tests/LoginTests.swift | 28 ------------------- WordPress/WordPress.xcodeproj/project.pbxproj | 6 ---- 2 files changed, 34 deletions(-) delete mode 100644 WordPress/UITests/Tests/LoginTests.swift diff --git a/WordPress/UITests/Tests/LoginTests.swift b/WordPress/UITests/Tests/LoginTests.swift deleted file mode 100644 index d46c656c0ab0..000000000000 --- a/WordPress/UITests/Tests/LoginTests.swift +++ /dev/null @@ -1,28 +0,0 @@ -import UITestsFoundation -import XCTest - -@MainActor -class LoginTests: XCTestCase { - - // Unified self hosted login/out - func testSelfHostedLoginLogout() throws { - setUpTestSuite() - try PrologueScreen() - .selectSiteAddress() - .proceedWith(siteAddress: WPUITestCredentials.selfHostedSiteAddress) - .proceedWithSelfHosted( - username: WPUITestCredentials.selfHostedUsername, - password: WPUITestCredentials.selfHostedPassword - ) - if XCTestCase.isPad { - try SidebarNavComponent() - .openSiteMenu() - .removeSelfHostedSite() - } else { - try MySiteScreen() - .removeSelfHostedSite() - } - try PrologueScreen() - .assertScreenIsLoaded() - } -} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 28e34b5edebf..6258e599f045 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -241,7 +241,6 @@ EA14532A29AD874C001F3143 /* ReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB10E3F27487F5D000DA4C1 /* ReaderTests.swift */; }; EA14532B29AD874C001F3143 /* EditorAztecTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BED4D82F1FF11DEF00A11345 /* EditorAztecTests.swift */; }; EA14532C29AD874C001F3143 /* EditorGutenbergTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2BB0CF228ACF710034F9AB /* EditorGutenbergTests.swift */; }; - EA14532D29AD874C001F3143 /* LoginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2716911CAAC87B0006E2D4 /* LoginTests.swift */; }; EA14532E29AD874C001F3143 /* BaseScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2B4E9E1FD664F5007AE3E4 /* BaseScreen.swift */; }; EA14533129AD874C001F3143 /* WPUITestCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC8A5EAA22159FA6001B7874 /* WPUITestCredentials.swift */; }; EA14533229AD874C001F3143 /* SignupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC7CB97222B1510900642EE9 /* SignupTests.swift */; }; @@ -300,7 +299,6 @@ FAF64B982637DEEC00E8A1DF /* ScreenshotCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9463A7221C05EE90081F11E /* ScreenshotCredentials.swift */; }; FAF64E4F2637E85800E8A1DF /* JetpackScreenshotGeneration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAF64E4E2637E85800E8A1DF /* JetpackScreenshotGeneration.swift */; }; FD3D6D2C1349F5D30061136A /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD3D6D2B1349F5D30061136A /* ImageIO.framework */; }; - FF2716921CAAC87B0006E2D4 /* LoginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2716911CAAC87B0006E2D4 /* LoginTests.swift */; }; FF2716A11CABC7D40006E2D4 /* XCTest+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2716A01CABC7D40006E2D4 /* XCTest+Extensions.swift */; }; FF4DEAD8244B56E300ACA032 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF4DEAD7244B56E200ACA032 /* CoreServices.framework */; }; FF75933B1BE2423800814D3B /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF75933A1BE2423800814D3B /* Photos.framework */; }; @@ -1033,7 +1031,6 @@ FD3D6D2B1349F5D30061136A /* ImageIO.framework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; FDCB9A89134B75B900E5C776 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; FF27168F1CAAC87A0006E2D4 /* WordPressUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WordPressUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - FF2716911CAAC87B0006E2D4 /* LoginTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginTests.swift; sourceTree = ""; }; FF2716931CAAC87B0006E2D4 /* WordPressUITests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WordPressUITests-Info.plist"; sourceTree = ""; }; FF2716A01CABC7D40006E2D4 /* XCTest+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTest+Extensions.swift"; sourceTree = ""; }; FF37F90822385C9F00AFA3DB /* RELEASE-NOTES.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "RELEASE-NOTES.txt"; path = "../RELEASE-NOTES.txt"; sourceTree = ""; }; @@ -2038,7 +2035,6 @@ D82E087429EEB0B00098F500 /* DashboardTests.swift */, BED4D82F1FF11DEF00A11345 /* EditorAztecTests.swift */, CC2BB0CF228ACF710034F9AB /* EditorGutenbergTests.swift */, - FF2716911CAAC87B0006E2D4 /* LoginTests.swift */, 01281E9B2A051EEA00464F8F /* MySiteTests.swift */, 809A91022A7A4C710063D4FA /* NotificationTests.swift */, 80B42ABE2AB2CB1300377607 /* PagesTests.swift */, @@ -3763,7 +3759,6 @@ EA14532B29AD874C001F3143 /* EditorAztecTests.swift in Sources */, D82E087629EEB0B00098F500 /* DashboardTests.swift in Sources */, EA14532C29AD874C001F3143 /* EditorGutenbergTests.swift in Sources */, - EA14532D29AD874C001F3143 /* LoginTests.swift in Sources */, 80B42AC02AB2CB1400377607 /* PagesTests.swift in Sources */, EA14532E29AD874C001F3143 /* BaseScreen.swift in Sources */, 0C3858202CA74DC7004880ED /* AppSettingsTests.swift in Sources */, @@ -3809,7 +3804,6 @@ BED4D8301FF11DEF00A11345 /* EditorAztecTests.swift in Sources */, D82E087529EEB0B00098F500 /* DashboardTests.swift in Sources */, 3F2F856326FAF612000FCDA5 /* EditorGutenbergTests.swift in Sources */, - FF2716921CAAC87B0006E2D4 /* LoginTests.swift in Sources */, 80B42ABF2AB2CB1300377607 /* PagesTests.swift in Sources */, BE2B4E9F1FD664F5007AE3E4 /* BaseScreen.swift in Sources */, 0C3858212CA74DC7004880ED /* AppSettingsTests.swift in Sources */, From 1954636c013e8e4fad71e33b850486da52b7a109 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 17 Feb 2026 12:30:38 +1300 Subject: [PATCH 2/2] Fix UI tests --- .../Screens/Editor/BlockEditorScreen.swift | 21 ++++++++++++----- .../Screens/MySiteScreen.swift | 23 +++++++++++++------ .../Screens/Navigation/SidebarScreen.swift | 2 +- .../Navigation/SidebarSiteMenuScreen.swift | 5 +++- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Modules/Sources/UITestsFoundation/Screens/Editor/BlockEditorScreen.swift b/Modules/Sources/UITestsFoundation/Screens/Editor/BlockEditorScreen.swift index dd73c44470e2..7bf8219c2170 100644 --- a/Modules/Sources/UITestsFoundation/Screens/Editor/BlockEditorScreen.swift +++ b/Modules/Sources/UITestsFoundation/Screens/Editor/BlockEditorScreen.swift @@ -318,10 +318,11 @@ public class BlockEditorScreen: ScreenObject { } private func dismissBlockEditorPopovers() { - // TODO: Find a better way to reliably dismiss a UIMenu without interacting with it - waitAndTap(postSettingsButton) - _ = try? EditorPostSettings().closePostSettings() - + if dismissPopoverRegion.exists { + dismissPopoverRegion.tap() + } else { + app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + } dismissImageViewIfNeeded() } @@ -467,7 +468,7 @@ public class BlockEditorScreen: ScreenObject { // Safety check XCTAssertTrue(element.waitForExistence(timeout: 1)) - element.doubleTap() + doubleTapElement(element) let pasteButton = app.menuItems["Paste"] @@ -477,7 +478,7 @@ public class BlockEditorScreen: ScreenObject { element.descendants(matching: .any).enumerated().forEach { e in guard found == false else { return } - e.element.firstMatch.doubleTap() + doubleTapElement(e.element.firstMatch) if pasteButton.waitForExistence(timeout: 1) { found = true @@ -489,4 +490,12 @@ public class BlockEditorScreen: ScreenObject { pasteButton.tap() } + + private func doubleTapElement(_ element: XCUIElement) { + if element.isHittable { + element.doubleTap() + } else { + element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).doubleTap() + } + } } diff --git a/Modules/Sources/UITestsFoundation/Screens/MySiteScreen.swift b/Modules/Sources/UITestsFoundation/Screens/MySiteScreen.swift index 5952819158a9..55daa0d06275 100644 --- a/Modules/Sources/UITestsFoundation/Screens/MySiteScreen.swift +++ b/Modules/Sources/UITestsFoundation/Screens/MySiteScreen.swift @@ -127,13 +127,22 @@ public class MySiteScreen: ScreenObject { var duration: TimeInterval = 10.0 public init(app: XCUIApplication = XCUIApplication()) throws { - try super.init( - expectedElementGetters: [ - switchSiteButtonGetter, - createButtonGetter - ], - app: app - ) + if XCTestCase.isPad { + try super.init( + expectedElementGetters: [ + createButtonGetter + ], + app: app + ) + } else { + try super.init( + expectedElementGetters: [ + switchSiteButtonGetter, + createButtonGetter + ], + app: app + ) + } } public func showSiteSwitcher() throws -> MySitesScreen { diff --git a/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarScreen.swift b/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarScreen.swift index 4595216f0eb0..dad2992fb4c0 100644 --- a/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarScreen.swift +++ b/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarScreen.swift @@ -5,7 +5,7 @@ import XCTest public class SidebarScreen: ScreenObject { public init(app: XCUIApplication = XCUIApplication()) throws { try super.init { - $0.collectionViews["sidebar_list"].firstMatch + $0.buttons["sidebar_me"].firstMatch } } diff --git a/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarSiteMenuScreen.swift b/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarSiteMenuScreen.swift index 180878416752..9b2ec80b462a 100644 --- a/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarSiteMenuScreen.swift +++ b/Modules/Sources/UITestsFoundation/Screens/Navigation/SidebarSiteMenuScreen.swift @@ -18,7 +18,10 @@ public class SidebarSiteMenuScreen: ScreenObject { } func openSidebar() throws -> SidebarScreen { - navigationBar.buttons.element(boundBy: 0).tap() + let sidebarMeButton = app.buttons["sidebar_me"].firstMatch + if !sidebarMeButton.isHittable { + navigationBar.buttons.element(boundBy: 0).tap() + } return try SidebarScreen() }