From 729853e526a9b42704e3fcba487b12683af26d75 Mon Sep 17 00:00:00 2001 From: shamanec Date: Sun, 23 Jul 2023 12:18:23 +0300 Subject: [PATCH] add more changes --- .../project.pbxproj | 8 ++++ .../UserInterfaceState.xcuserstate | Bin 66457 -> 69632 bytes xcuitest-sample-proj/AppDelegate.swift | 7 +++ .../Views/TextFieldWrapper.swift | 43 ++++++++++++++++++ .../XCUIApplication+Extensions.swift | 14 ++++++ .../XCUIElementQuery+Extensions.swift | 5 ++ .../Foundations/BaseTest.swift | 1 + .../Helpers/ElementsHelper.swift | 4 ++ .../Pages/FirstPage.swift | 2 +- .../xcuitest_sample_projUITests.swift | 8 ++++ 10 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 xcuitest-sample-proj/Views/TextFieldWrapper.swift create mode 100644 xcuitest-sample-projUITests/Extensions/XCUIApplication+Extensions.swift diff --git a/xcuitest-sample-proj.xcodeproj/project.pbxproj b/xcuitest-sample-proj.xcodeproj/project.pbxproj index b9c0b03..0cf6b55 100644 --- a/xcuitest-sample-proj.xcodeproj/project.pbxproj +++ b/xcuitest-sample-proj.xcodeproj/project.pbxproj @@ -22,6 +22,8 @@ FFF034912A6CFA8B00A33E97 /* BasePage.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF034902A6CFA8B00A33E97 /* BasePage.swift */; }; FFF034932A6CFEA200A33E97 /* SecondPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF034922A6CFEA200A33E97 /* SecondPage.swift */; }; FFF034952A6D027B00A33E97 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF034942A6D027B00A33E97 /* TabBar.swift */; }; + FFF034992A6D219000A33E97 /* TextFieldWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF034982A6D219000A33E97 /* TextFieldWrapper.swift */; }; + FFF0349B2A6D227100A33E97 /* XCUIApplication+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF0349A2A6D227100A33E97 /* XCUIApplication+Extensions.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,6 +62,8 @@ FFF034902A6CFA8B00A33E97 /* BasePage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasePage.swift; sourceTree = ""; }; FFF034922A6CFEA200A33E97 /* SecondPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondPage.swift; sourceTree = ""; }; FFF034942A6D027B00A33E97 /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; + FFF034982A6D219000A33E97 /* TextFieldWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldWrapper.swift; sourceTree = ""; }; + FFF0349A2A6D227100A33E97 /* XCUIApplication+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIApplication+Extensions.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -153,6 +157,7 @@ children = ( FF79C27E2A66F3A000BBC60A /* XCUIElement+Extensions.swift */, FF79C2802A66F45200BBC60A /* XCUIElementQuery+Extensions.swift */, + FFF0349A2A6D227100A33E97 /* XCUIApplication+Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -178,6 +183,7 @@ isa = PBXGroup; children = ( FF86799D2A696BDC00C4A1A7 /* CarouselItemView.swift */, + FFF034982A6D219000A33E97 /* TextFieldWrapper.swift */, ); path = Views; sourceTree = ""; @@ -321,6 +327,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + FFF034992A6D219000A33E97 /* TextFieldWrapper.swift in Sources */, FF86799B2A69699D00C4A1A7 /* AppDelegate.swift in Sources */, FF86799E2A696BDC00C4A1A7 /* CarouselItemView.swift in Sources */, ); @@ -343,6 +350,7 @@ FFF034952A6D027B00A33E97 /* TabBar.swift in Sources */, FF79C2892A66F9F500BBC60A /* InteractionHelper.swift in Sources */, FF4D5CB02A68033C00B52624 /* ElementsHelper.swift in Sources */, + FFF0349B2A6D227100A33E97 /* XCUIApplication+Extensions.swift in Sources */, FFF0348F2A6CFA6500A33E97 /* FirstPage.swift in Sources */, FF79C2862A66F72200BBC60A /* TestConstants.swift in Sources */, FF79C27F2A66F3A000BBC60A /* XCUIElement+Extensions.swift in Sources */, diff --git a/xcuitest-sample-proj.xcodeproj/project.xcworkspace/xcuserdata/shamanec.xcuserdatad/UserInterfaceState.xcuserstate b/xcuitest-sample-proj.xcodeproj/project.xcworkspace/xcuserdata/shamanec.xcuserdatad/UserInterfaceState.xcuserstate index 0d850964a5aceaf41a9f5529158f2741b2ba30c9..bb9b263d8b20db9ce2fae4b0a84c88d00cc4f0c2 100644 GIT binary patch delta 30103 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�QZuDl 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 RS6}_FL%#oC|9|gm{tN#7LvR29 diff --git a/xcuitest-sample-proj/AppDelegate.swift b/xcuitest-sample-proj/AppDelegate.swift index aac8aab..ff6d81c 100644 --- a/xcuitest-sample-proj/AppDelegate.swift +++ b/xcuitest-sample-proj/AppDelegate.swift @@ -34,6 +34,7 @@ struct TabBarView: View { struct CarouselView: View { @State private var isButtonVisible = true + @State private var text: String = "" var body: some View { VStack { @@ -63,6 +64,12 @@ struct CarouselView: View { .accessibilityIdentifier("disappearing-button") } } + + TextFieldWrapper(text: $text) + .padding() + .frame(width: 200, height: 50) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .accessibilityIdentifier("text-field") } } diff --git a/xcuitest-sample-proj/Views/TextFieldWrapper.swift b/xcuitest-sample-proj/Views/TextFieldWrapper.swift new file mode 100644 index 0000000..dcf724d --- /dev/null +++ b/xcuitest-sample-proj/Views/TextFieldWrapper.swift @@ -0,0 +1,43 @@ +// +// TextFieldWrapper.swift +// xcuitest-sample-proj +// +// Created by Nikola Shabanov on 23.07.23. +// + +import SwiftUI + +struct TextFieldWrapper: UIViewRepresentable { + @Binding var text: String + + func makeUIView(context: Context) -> UITextField { + let textField = UITextField() + textField.delegate = context.coordinator + + // Apply the black border to the UITextField + textField.layer.borderColor = UIColor.black.cgColor + textField.layer.borderWidth = 1.0 + + return textField + } + + func updateUIView(_ uiView: UITextField, context: Context) { + uiView.text = text + } + + func makeCoordinator() -> Coordinator { + Coordinator(text: $text) + } + + class Coordinator: NSObject, UITextFieldDelegate { + @Binding var text: String + + init(text: Binding) { + _text = text + } + + func textFieldDidChangeSelection(_ textField: UITextField) { + text = textField.text ?? "" + } + } +} diff --git a/xcuitest-sample-projUITests/Extensions/XCUIApplication+Extensions.swift b/xcuitest-sample-projUITests/Extensions/XCUIApplication+Extensions.swift new file mode 100644 index 0000000..27f6f47 --- /dev/null +++ b/xcuitest-sample-projUITests/Extensions/XCUIApplication+Extensions.swift @@ -0,0 +1,14 @@ +// +// XCUIApplication+Extensions.swift +// xcuitest-sample-projUITests +// +// Created by Nikola Shabanov on 23.07.23. +// + +import XCTest + +extension XCUIApplication { + + /// Tap the zero coordinate of the app, useful for closing keyboards or triggering UIApplicationMonitor + func tapZero() { coordinate(withNormalizedOffset: .zero).tap() } +} diff --git a/xcuitest-sample-projUITests/Extensions/XCUIElementQuery+Extensions.swift b/xcuitest-sample-projUITests/Extensions/XCUIElementQuery+Extensions.swift index f898101..9864f13 100644 --- a/xcuitest-sample-projUITests/Extensions/XCUIElementQuery+Extensions.swift +++ b/xcuitest-sample-projUITests/Extensions/XCUIElementQuery+Extensions.swift @@ -15,22 +15,27 @@ extension XCUIElementQuery { var isEmpty: Bool { count == 0 } // MARK: Return element by predicate methods + /// Get element where the label exactly matches the provided string func element(withLabelMatching text: String) -> XCUIElement { return element(matching: NSPredicate(format: "label == %@", text)) } + /// Get element where the label contains the provided string func element(withLabelContaining text: String) -> XCUIElement { return element(matching: NSPredicate(format: "label CONTAINS %@", text)) } + /// Get element where the label ends with the provided string func element(withLabelSuffixed text: String) -> XCUIElement { return element(matching: NSPredicate(format: "label ENDSWITH %@", text)) } + /// Get element where the label begins with the provided string func element(withLabelPrefixed text: String) -> XCUIElement { return element(matching: NSPredicate(format: "label BEGINSWITH %@", text)) } + /// Get element where the label func element(withLabelLike text: String) -> XCUIElement { return element(matching: NSPredicate(format: "label LIKE %@", text)) } diff --git a/xcuitest-sample-projUITests/Foundations/BaseTest.swift b/xcuitest-sample-projUITests/Foundations/BaseTest.swift index 96cfc0c..20aaa9b 100644 --- a/xcuitest-sample-projUITests/Foundations/BaseTest.swift +++ b/xcuitest-sample-projUITests/Foundations/BaseTest.swift @@ -11,6 +11,7 @@ class BaseTest: XCTestCase { private let defaultLoadingTime = 30.0 static var isReflectionIdleEnabled = false private let app = XCUIApplication() + private let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") override func setUp() { // Fail-fast tests diff --git a/xcuitest-sample-projUITests/Helpers/ElementsHelper.swift b/xcuitest-sample-projUITests/Helpers/ElementsHelper.swift index 9b85859..aa40b7c 100644 --- a/xcuitest-sample-projUITests/Helpers/ElementsHelper.swift +++ b/xcuitest-sample-projUITests/Helpers/ElementsHelper.swift @@ -87,4 +87,8 @@ class ElementsHelper: XCTest { } XCTAssertTrue(result, "\(firstElement) is not in `\(relativePosition)` relative position to \(secondElement)") } + + class func waitForElement(_ element: XCUIElement, _ timeoutValue: Double) -> Bool { + return element.waitForExistence(timeout: timeoutValue) + } } diff --git a/xcuitest-sample-projUITests/Pages/FirstPage.swift b/xcuitest-sample-projUITests/Pages/FirstPage.swift index b9b46af..44fa8c4 100644 --- a/xcuitest-sample-projUITests/Pages/FirstPage.swift +++ b/xcuitest-sample-projUITests/Pages/FirstPage.swift @@ -11,6 +11,6 @@ class FirstPage: BasePage { var carousel: XCUIElement { app.scrollViews.matching(identifier: "carousel-view").firstMatch } var carouselItems: XCUIElementQuery { carousel.staticTexts } var disappearingButton: XCUIElement { app.buttons["disappearing-button"] } - + var textField: XCUIElement { app.textFields["text-field"] } } diff --git a/xcuitest-sample-projUITests/xcuitest_sample_projUITests.swift b/xcuitest-sample-projUITests/xcuitest_sample_projUITests.swift index 2a6b6fe..21a1838 100644 --- a/xcuitest-sample-projUITests/xcuitest_sample_projUITests.swift +++ b/xcuitest-sample-projUITests/xcuitest_sample_projUITests.swift @@ -57,4 +57,12 @@ final class xcuitest_sample_projUITests: BaseTest { // Wait 5 more seconds to have 6 elements, should fail because only 5 in total will be loaded ElementsHelper.waitUntilTableFilled(elements, 6, TestConstants.Timeout.short) } + + func testTypeText() { + let textToType = "typed-text" + firstPage.textField.tap() + firstPage.textField.typeText(textToType) + let typedText = firstPage.textField.textFromValue + XCTAssertEqual(textToType, typedText) + } }