From 5219b15ea454fb7f3caee8d3ffdf67c41c1f9458 Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Thu, 9 Oct 2025 13:30:00 +0200 Subject: [PATCH 1/7] added configurable navigation --- ios/accessibility/accessibility_control.go | 78 ++++++++++++++++++++-- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/ios/accessibility/accessibility_control.go b/ios/accessibility/accessibility_control.go index 4ba99fbc..4c537067 100644 --- a/ios/accessibility/accessibility_control.go +++ b/ios/accessibility/accessibility_control.go @@ -1,6 +1,7 @@ package accessibility import ( + "encoding/base64" "fmt" dtx "github.com/danielpaulus/go-ios/ios/dtx_codec" @@ -14,6 +15,14 @@ type ControlInterface struct { channel *dtx.Channel } +// Direction represents navigation direction values used by AX service +const ( + DirectionPrevious int32 = 3 + DirectionNext int32 = 4 + DirectionFirst int32 = 5 + DirectionLast int32 = 6 +) + func (a ControlInterface) readhostAppStateChanged() { for { msg := a.channel.ReceiveMethodCall("hostAppStateChanged:") @@ -131,14 +140,69 @@ func (a ControlInterface) TurnOff() { a.deviceInspectorShowVisuals(false) } -// GetElement moves the green selection rectangle one element further -func (a ControlInterface) GetElement() { +// Move navigates focus using the given direction and returns selected fields as a map. +func (a ControlInterface) Move(direction int32) map[string]interface{} { log.Info("changing") - a.deviceInspectorMoveWithOptions() - // a.deviceInspectorMoveWithOptions() + a.deviceInspectorMoveWithOptions(direction) + log.Info("before changed") resp := a.awaitHostInspectorCurrentElementChanged() - log.Info("item changed", resp) + + result := make(map[string]interface{}) + + // Extraction path for platform element bytes: + // Value -> Value -> ElementValue_v1 -> Value -> Value -> PlatformElementValue_v1 -> Value ([]byte) + value, ok := resp["Value"].(map[string]interface{}) + if !ok { + log.Warn("resp[\"Value\"] is not a map") + return result + } + + innerValue, ok := value["Value"].(map[string]interface{}) + if !ok { + log.Warn("Value[\"Value\"] is not a map") + return result + } + + elementValue, ok := innerValue["ElementValue_v1"].(map[string]interface{}) + if !ok { + log.Warn("ElementValue_v1 is not a map") + return result + } + + axElement, ok := elementValue["Value"].(map[string]interface{}) + if !ok { + log.Warn("ElementValue_v1[\"Value\"] is not a map") + return result + } + + // Split assertions for safety/readability + valMap, ok := axElement["Value"].(map[string]interface{}) + if !ok { + log.Warn("AX element inner \"Value\" is not a map") + return result + } + platformElement, ok := valMap["PlatformElementValue_v1"].(map[string]interface{}) + if !ok { + log.Warn("PlatformElementValue_v1 is not a map") + return result + } + + byteArray, ok := platformElement["Value"].([]byte) + if !ok { + log.Warn("PlatformElementValue_v1[\"Value\"] is not a []byte") + return result + } + encoded := base64.StdEncoding.EncodeToString(byteArray) + + result["platformElementValue"] = encoded + + return result +} + +// GetElement moves the green selection rectangle one element further +func (a ControlInterface) GetElement() { + a.Move(DirectionNext) } func (a ControlInterface) UpdateAccessibilitySetting(name string, val interface{}) { @@ -175,13 +239,13 @@ func (a ControlInterface) awaitHostInspectorMonitoredEventTypeChanged() { log.Infof("hostInspectorMonitoredEventTypeChanged: was set to %d by the device", n[0]) } -func (a ControlInterface) deviceInspectorMoveWithOptions() { +func (a ControlInterface) deviceInspectorMoveWithOptions(direction int32) { method := "deviceInspectorMoveWithOptions:" options := nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{ "ObjectType": "passthrough", "Value": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{ "allowNonAX": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": false}), - "direction": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": int32(4)}), + "direction": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": direction}), "includeContainers": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": true}), }), }) From a82b1dec6e309269a1a2a84c36f691a8e166937c Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Thu, 9 Oct 2025 14:02:51 +0200 Subject: [PATCH 2/7] added timeout --- ios/accessibility/accessibility_control.go | 11 ++++++++--- ios/dtx_codec/channel.go | 12 ++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ios/accessibility/accessibility_control.go b/ios/accessibility/accessibility_control.go index 4c537067..406e45fb 100644 --- a/ios/accessibility/accessibility_control.go +++ b/ios/accessibility/accessibility_control.go @@ -3,6 +3,7 @@ package accessibility import ( "encoding/base64" "fmt" + "time" dtx "github.com/danielpaulus/go-ios/ios/dtx_codec" "github.com/danielpaulus/go-ios/ios/nskeyedarchiver" @@ -145,11 +146,10 @@ func (a ControlInterface) Move(direction int32) map[string]interface{} { log.Info("changing") a.deviceInspectorMoveWithOptions(direction) log.Info("before changed") + result := make(map[string]interface{}) resp := a.awaitHostInspectorCurrentElementChanged() - result := make(map[string]interface{}) - // Extraction path for platform element bytes: // Value -> Value -> ElementValue_v1 -> Value -> Value -> PlatformElementValue_v1 -> Value ([]byte) value, ok := resp["Value"].(map[string]interface{}) @@ -224,7 +224,12 @@ func (a ControlInterface) ResetToDefaultAccessibilitySettings() error { } func (a ControlInterface) awaitHostInspectorCurrentElementChanged() map[string]interface{} { - msg := a.channel.ReceiveMethodCall("hostInspectorCurrentElementChanged:") + timeout := 2 * time.Second + msg, err := a.channel.ReceiveMethodCallWithTimeout("hostInspectorCurrentElementChanged:", timeout) + if err != nil { + log.Errorf("Timeout waiting for hostInspectorCurrentElementChanged (timeout: %v): %v", timeout, err) + panic(fmt.Sprintf("Timeout waiting for hostInspectorCurrentElementChanged: %s", err)) + } log.Info("received hostInspectorCurrentElementChanged") result, err := nskeyedarchiver.Unarchive(msg.Auxiliary.GetArguments()[0].([]byte)) if err != nil { diff --git a/ios/dtx_codec/channel.go b/ios/dtx_codec/channel.go index bba99765..a021cb3c 100644 --- a/ios/dtx_codec/channel.go +++ b/ios/dtx_codec/channel.go @@ -46,6 +46,18 @@ func (d *Channel) ReceiveMethodCall(selector string) Message { return <-channel } +func (d *Channel) ReceiveMethodCallWithTimeout(selector string, timeout time.Duration) (Message, error) { + d.mutex.Lock() + channel := d.registeredMethods[selector] + d.mutex.Unlock() + select { + case msg := <-channel: + return msg, nil + case <-time.After(timeout): + return Message{}, fmt.Errorf("timeout waiting for selector %s", selector) + } +} + // MethodCall is the standard DTX style remote method invocation pattern. The ObjectiveC Selector goes as a NSKeyedArchiver.archived NSString into the // DTXMessage payload, and the arguments are separately NSKeyArchiver.archived and put into the Auxiliary DTXPrimitiveDictionary. It returns the response message and an error. func (d *Channel) MethodCall(selector string, args ...interface{}) (Message, error) { From 49c9cd659a785f1073805492ea7da82cd7b3227e Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Thu, 9 Oct 2025 14:15:03 +0200 Subject: [PATCH 3/7] fixed comment --- ios/accessibility/accessibility_control.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/accessibility/accessibility_control.go b/ios/accessibility/accessibility_control.go index 406e45fb..04844474 100644 --- a/ios/accessibility/accessibility_control.go +++ b/ios/accessibility/accessibility_control.go @@ -141,7 +141,7 @@ func (a ControlInterface) TurnOff() { a.deviceInspectorShowVisuals(false) } -// Move navigates focus using the given direction and returns selected fields as a map. +// Move navigates focus using the given direction and returns selected PlatformElementValue_v1 as a map. func (a ControlInterface) Move(direction int32) map[string]interface{} { log.Info("changing") a.deviceInspectorMoveWithOptions(direction) From 69d340c1c2fa90c33eccfbbb0f935c38b4d6f31d Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Thu, 9 Oct 2025 14:30:19 +0200 Subject: [PATCH 4/7] return err instead of panic --- ios/accessibility/accessibility_control.go | 39 +++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/ios/accessibility/accessibility_control.go b/ios/accessibility/accessibility_control.go index 04844474..e8e3921d 100644 --- a/ios/accessibility/accessibility_control.go +++ b/ios/accessibility/accessibility_control.go @@ -125,7 +125,10 @@ func (a ControlInterface) SwitchToDevice() { a.deviceInspectorShowIgnoredElements(false) a.deviceSetAuditTargetPid(0) a.deviceInspectorFocusOnElement() - a.awaitHostInspectorCurrentElementChanged() + _, err := a.awaitHostInspectorCurrentElementChanged() + if err != nil { + log.Warnf("await element change failed during SwitchToDevice: %v", err) + } a.deviceInspectorPreviewOnElement() a.deviceHighlightIssue() } @@ -135,69 +138,75 @@ func (a ControlInterface) TurnOff() { a.deviceInspectorSetMonitoredEventType(0) a.awaitHostInspectorMonitoredEventTypeChanged() a.deviceInspectorFocusOnElement() - a.awaitHostInspectorCurrentElementChanged() + _, err := a.awaitHostInspectorCurrentElementChanged() + if err != nil { + log.Warnf("await element change failed during TurnOff: %v", err) + } a.deviceInspectorPreviewOnElement() a.deviceHighlightIssue() a.deviceInspectorShowVisuals(false) } // Move navigates focus using the given direction and returns selected PlatformElementValue_v1 as a map. -func (a ControlInterface) Move(direction int32) map[string]interface{} { +func (a ControlInterface) Move(direction int32) (map[string]interface{}, error) { log.Info("changing") a.deviceInspectorMoveWithOptions(direction) log.Info("before changed") result := make(map[string]interface{}) - resp := a.awaitHostInspectorCurrentElementChanged() + resp, err := a.awaitHostInspectorCurrentElementChanged() + if err != nil { + return result, err + } // Extraction path for platform element bytes: // Value -> Value -> ElementValue_v1 -> Value -> Value -> PlatformElementValue_v1 -> Value ([]byte) value, ok := resp["Value"].(map[string]interface{}) if !ok { log.Warn("resp[\"Value\"] is not a map") - return result + return result, nil } innerValue, ok := value["Value"].(map[string]interface{}) if !ok { log.Warn("Value[\"Value\"] is not a map") - return result + return result, nil } elementValue, ok := innerValue["ElementValue_v1"].(map[string]interface{}) if !ok { log.Warn("ElementValue_v1 is not a map") - return result + return result, nil } axElement, ok := elementValue["Value"].(map[string]interface{}) if !ok { log.Warn("ElementValue_v1[\"Value\"] is not a map") - return result + return result, nil } // Split assertions for safety/readability valMap, ok := axElement["Value"].(map[string]interface{}) if !ok { log.Warn("AX element inner \"Value\" is not a map") - return result + return result, nil } platformElement, ok := valMap["PlatformElementValue_v1"].(map[string]interface{}) if !ok { log.Warn("PlatformElementValue_v1 is not a map") - return result + return result, nil } byteArray, ok := platformElement["Value"].([]byte) if !ok { log.Warn("PlatformElementValue_v1[\"Value\"] is not a []byte") - return result + return result, nil } encoded := base64.StdEncoding.EncodeToString(byteArray) result["platformElementValue"] = encoded - return result + return result, nil } // GetElement moves the green selection rectangle one element further @@ -223,19 +232,19 @@ func (a ControlInterface) ResetToDefaultAccessibilitySettings() error { return nil } -func (a ControlInterface) awaitHostInspectorCurrentElementChanged() map[string]interface{} { +func (a ControlInterface) awaitHostInspectorCurrentElementChanged() (map[string]interface{}, error) { timeout := 2 * time.Second msg, err := a.channel.ReceiveMethodCallWithTimeout("hostInspectorCurrentElementChanged:", timeout) if err != nil { log.Errorf("Timeout waiting for hostInspectorCurrentElementChanged (timeout: %v): %v", timeout, err) - panic(fmt.Sprintf("Timeout waiting for hostInspectorCurrentElementChanged: %s", err)) + return nil, fmt.Errorf("timeout waiting for hostInspectorCurrentElementChanged: %w", err) } log.Info("received hostInspectorCurrentElementChanged") result, err := nskeyedarchiver.Unarchive(msg.Auxiliary.GetArguments()[0].([]byte)) if err != nil { panic(fmt.Sprintf("Failed unarchiving: %s this is a bug and should not happen", err)) } - return result[0].(map[string]interface{}) + return result[0].(map[string]interface{}), nil } func (a ControlInterface) awaitHostInspectorMonitoredEventTypeChanged() { From 35a4854572f9c015856742c099010829e2f4176d Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Fri, 10 Oct 2025 12:43:27 +0200 Subject: [PATCH 5/7] used context and struct --- ios/accessibility/accessibility_control.go | 70 ++++++++++++---------- ios/dtx_codec/channel.go | 20 ++++++- 2 files changed, 59 insertions(+), 31 deletions(-) diff --git a/ios/accessibility/accessibility_control.go b/ios/accessibility/accessibility_control.go index e8e3921d..cf41c18f 100644 --- a/ios/accessibility/accessibility_control.go +++ b/ios/accessibility/accessibility_control.go @@ -1,6 +1,7 @@ package accessibility import ( + "context" "encoding/base64" "fmt" "time" @@ -17,13 +18,20 @@ type ControlInterface struct { } // Direction represents navigation direction values used by AX service +type MoveDirection int32 + const ( - DirectionPrevious int32 = 3 - DirectionNext int32 = 4 - DirectionFirst int32 = 5 - DirectionLast int32 = 6 + DirectionPrevious MoveDirection = 3 + DirectionNext MoveDirection = 4 + DirectionFirst MoveDirection = 5 + DirectionLast MoveDirection = 6 ) +// AXElementData represents the data returned from Move operations +type AXElementData struct { + PlatformElementValue string `json:"platformElementValue"` // Base64-encoded platform element data +} + func (a ControlInterface) readhostAppStateChanged() { for { msg := a.channel.ReceiveMethodCall("hostAppStateChanged:") @@ -125,7 +133,7 @@ func (a ControlInterface) SwitchToDevice() { a.deviceInspectorShowIgnoredElements(false) a.deviceSetAuditTargetPid(0) a.deviceInspectorFocusOnElement() - _, err := a.awaitHostInspectorCurrentElementChanged() + _, err := a.awaitHostInspectorCurrentElementChanged(context.Background()) if err != nil { log.Warnf("await element change failed during SwitchToDevice: %v", err) } @@ -138,7 +146,7 @@ func (a ControlInterface) TurnOff() { a.deviceInspectorSetMonitoredEventType(0) a.awaitHostInspectorMonitoredEventTypeChanged() a.deviceInspectorFocusOnElement() - _, err := a.awaitHostInspectorCurrentElementChanged() + _, err := a.awaitHostInspectorCurrentElementChanged(context.Background()) if err != nil { log.Warnf("await element change failed during TurnOff: %v", err) } @@ -147,16 +155,19 @@ func (a ControlInterface) TurnOff() { a.deviceInspectorShowVisuals(false) } -// Move navigates focus using the given direction and returns selected PlatformElementValue_v1 as a map. -func (a ControlInterface) Move(direction int32) (map[string]interface{}, error) { +// Move navigates focus using the given direction and returns selected element data. +func (a ControlInterface) Move(direction MoveDirection) (AXElementData, error) { + + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + log.Info("changing") a.deviceInspectorMoveWithOptions(direction) log.Info("before changed") - result := make(map[string]interface{}) - resp, err := a.awaitHostInspectorCurrentElementChanged() + resp, err := a.awaitHostInspectorCurrentElementChanged(ctx) if err != nil { - return result, err + return AXElementData{}, err } // Extraction path for platform element bytes: @@ -164,54 +175,54 @@ func (a ControlInterface) Move(direction int32) (map[string]interface{}, error) value, ok := resp["Value"].(map[string]interface{}) if !ok { log.Warn("resp[\"Value\"] is not a map") - return result, nil + return AXElementData{}, nil } innerValue, ok := value["Value"].(map[string]interface{}) if !ok { log.Warn("Value[\"Value\"] is not a map") - return result, nil + return AXElementData{}, nil } elementValue, ok := innerValue["ElementValue_v1"].(map[string]interface{}) if !ok { log.Warn("ElementValue_v1 is not a map") - return result, nil + return AXElementData{}, nil } axElement, ok := elementValue["Value"].(map[string]interface{}) if !ok { log.Warn("ElementValue_v1[\"Value\"] is not a map") - return result, nil + return AXElementData{}, nil } // Split assertions for safety/readability valMap, ok := axElement["Value"].(map[string]interface{}) if !ok { log.Warn("AX element inner \"Value\" is not a map") - return result, nil + return AXElementData{}, nil } platformElement, ok := valMap["PlatformElementValue_v1"].(map[string]interface{}) if !ok { log.Warn("PlatformElementValue_v1 is not a map") - return result, nil + return AXElementData{}, nil } byteArray, ok := platformElement["Value"].([]byte) if !ok { log.Warn("PlatformElementValue_v1[\"Value\"] is not a []byte") - return result, nil + return AXElementData{}, nil } encoded := base64.StdEncoding.EncodeToString(byteArray) - result["platformElementValue"] = encoded - - return result, nil + return AXElementData{ + PlatformElementValue: encoded, + }, nil } // GetElement moves the green selection rectangle one element further -func (a ControlInterface) GetElement() { - a.Move(DirectionNext) +func (a ControlInterface) GetElement() (AXElementData, error) { + return a.Move(DirectionNext) } func (a ControlInterface) UpdateAccessibilitySetting(name string, val interface{}) { @@ -232,12 +243,11 @@ func (a ControlInterface) ResetToDefaultAccessibilitySettings() error { return nil } -func (a ControlInterface) awaitHostInspectorCurrentElementChanged() (map[string]interface{}, error) { - timeout := 2 * time.Second - msg, err := a.channel.ReceiveMethodCallWithTimeout("hostInspectorCurrentElementChanged:", timeout) +func (a ControlInterface) awaitHostInspectorCurrentElementChanged(ctx context.Context) (map[string]interface{}, error) { + msg, err := a.channel.ReceiveMethodCallWithTimeout("hostInspectorCurrentElementChanged:", ctx) if err != nil { - log.Errorf("Timeout waiting for hostInspectorCurrentElementChanged (timeout: %v): %v", timeout, err) - return nil, fmt.Errorf("timeout waiting for hostInspectorCurrentElementChanged: %w", err) + log.Errorf("Failed to receive hostInspectorCurrentElementChanged: %v", err) + return nil, fmt.Errorf("failed to receive hostInspectorCurrentElementChanged: %w", err) } log.Info("received hostInspectorCurrentElementChanged") result, err := nskeyedarchiver.Unarchive(msg.Auxiliary.GetArguments()[0].([]byte)) @@ -253,13 +263,13 @@ func (a ControlInterface) awaitHostInspectorMonitoredEventTypeChanged() { log.Infof("hostInspectorMonitoredEventTypeChanged: was set to %d by the device", n[0]) } -func (a ControlInterface) deviceInspectorMoveWithOptions(direction int32) { +func (a ControlInterface) deviceInspectorMoveWithOptions(direction MoveDirection) { method := "deviceInspectorMoveWithOptions:" options := nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{ "ObjectType": "passthrough", "Value": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{ "allowNonAX": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": false}), - "direction": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": direction}), + "direction": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": int32(direction)}), "includeContainers": nskeyedarchiver.NewNSMutableDictionary(map[string]interface{}{"ObjectType": "passthrough", "Value": true}), }), }) diff --git a/ios/dtx_codec/channel.go b/ios/dtx_codec/channel.go index a021cb3c..6f44bd57 100644 --- a/ios/dtx_codec/channel.go +++ b/ios/dtx_codec/channel.go @@ -1,6 +1,7 @@ package dtx import ( + "context" "fmt" "sync" "time" @@ -46,7 +47,24 @@ func (d *Channel) ReceiveMethodCall(selector string) Message { return <-channel } -func (d *Channel) ReceiveMethodCallWithTimeout(selector string, timeout time.Duration) (Message, error) { +func (d *Channel) ReceiveMethodCallWithTimeout(selector string, ctx context.Context) (Message, error) { + select { + case <-ctx.Done(): + return Message{}, ctx.Err() + default: + } + + var timeout time.Duration + if deadline, ok := ctx.Deadline(); ok { + timeout = time.Until(deadline) + if timeout <= 0 { + return Message{}, context.DeadlineExceeded + } + } else { + // default 5 seconds for dtx channel + timeout = d.timeout + } + d.mutex.Lock() channel := d.registeredMethods[selector] d.mutex.Unlock() From 2dcf6b2136a7cf9a687f720585fdfd34f7f59910 Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Fri, 10 Oct 2025 15:41:32 +0200 Subject: [PATCH 6/7] added test --- .../accessibility_integration_test.go | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ios/accessibility/accessibility_integration_test.go b/ios/accessibility/accessibility_integration_test.go index 4ee74782..aba15120 100644 --- a/ios/accessibility/accessibility_integration_test.go +++ b/ios/accessibility/accessibility_integration_test.go @@ -20,6 +20,7 @@ func TestIT(t *testing.T) { if err != nil { t.Fatal(err) } + defer conn.TurnOff() conn.SwitchToDevice() if err != nil { @@ -32,3 +33,42 @@ func TestIT(t *testing.T) { // conn.EnableSelectionMode() } + +func TestMove(t *testing.T) { + device, err := ios.GetDevice("") + if err != nil { + t.Fatal(err) + } + + conn, err := accessibility.New(device) + if err != nil { + t.Fatal(err) + } + defer conn.TurnOff() + + conn.SwitchToDevice() + if err != nil { + t.Fatal(err) + } + conn.EnableSelectionMode() + + t.Run("Test Move directions", func(t *testing.T) { + directions := []accessibility.MoveDirection{ + // newer ios(18+) devices sometimes doesn't bring focus to first element, so we need to move twice + accessibility.DirectionNext, + accessibility.DirectionNext, + accessibility.DirectionPrevious, + } + + for _, direction := range directions { + t.Logf("Testing direction: %v", direction) + element, err := conn.Move(direction) + if err != nil { + t.Logf("Move %v failed (expected on some devices): %v", direction, err) + continue + } + + t.Logf("Move %v succeeded: %+v", direction, element) + } + }) +} From 57e3fc1434cdbab50b1ad236a0f701603f839605 Mon Sep 17 00:00:00 2001 From: Sakhi Mansoor Date: Fri, 10 Oct 2025 15:44:07 +0200 Subject: [PATCH 7/7] remove redundant test --- .../accessibility_integration_test.go | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/ios/accessibility/accessibility_integration_test.go b/ios/accessibility/accessibility_integration_test.go index aba15120..863e2b5c 100644 --- a/ios/accessibility/accessibility_integration_test.go +++ b/ios/accessibility/accessibility_integration_test.go @@ -10,30 +10,6 @@ import ( "github.com/danielpaulus/go-ios/ios/accessibility" ) -func TestIT(t *testing.T) { - device, err := ios.GetDevice("") - if err != nil { - t.Fatal(err) - } - - conn, err := accessibility.New(device) - if err != nil { - t.Fatal(err) - } - defer conn.TurnOff() - - conn.SwitchToDevice() - if err != nil { - t.Fatal(err) - } - conn.EnableSelectionMode() - conn.GetElement() - conn.GetElement() - conn.TurnOff() - - // conn.EnableSelectionMode() -} - func TestMove(t *testing.T) { device, err := ios.GetDevice("") if err != nil {