Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f97d41b
os version set to iOS 26
markdevocht Nov 26, 2025
29d3fb0
cleanup
markdevocht Dec 29, 2025
cf94dc4
update simulator
markdevocht Dec 31, 2025
fd71962
webview test snapshot update
markdevocht Dec 31, 2025
45fb08a
element-screenshot test snapshot update
markdevocht Dec 31, 2025
dac7f07
update with timeout
markdevocht Dec 31, 2025
03a3f35
final test update
markdevocht Dec 31, 2025
a578b8b
update for newArch
markdevocht Dec 31, 2025
daa9316
screenshot updates
markdevocht Jan 11, 2026
3eca976
crash test update
markdevocht Jan 11, 2026
56736c1
sanity button update
markdevocht Jan 11, 2026
9d2d0e7
chore: upgrade allure adapter
noomorph Jan 13, 2026
7719fcd
update of snapshots for webview
markdevocht Jan 13, 2026
8a7dd49
chore: upgrade adapter
noomorph Jan 13, 2026
6a1a98e
more updates
markdevocht Jan 13, 2026
064cb25
using xcode 26.1
markdevocht Jan 14, 2026
744bc50
Revert "chore: upgrade allure adapter"
markdevocht Jan 14, 2026
089b133
update of flaky test
markdevocht Jan 14, 2026
d3bc157
os version set to iOS 26
markdevocht Nov 26, 2025
93543bb
cleanup
markdevocht Dec 29, 2025
4af642a
update simulator
markdevocht Dec 31, 2025
82acb00
webview test snapshot update
markdevocht Dec 31, 2025
a5805f5
element-screenshot test snapshot update
markdevocht Dec 31, 2025
986eead
update with timeout
markdevocht Dec 31, 2025
f5fe264
final test update
markdevocht Dec 31, 2025
5963003
update for newArch
markdevocht Dec 31, 2025
b8f0872
screenshot updates
markdevocht Jan 11, 2026
b1400d2
crash test update
markdevocht Jan 11, 2026
6ef999d
sanity button update
markdevocht Jan 11, 2026
1a742be
chore: upgrade allure adapter
noomorph Jan 13, 2026
085d953
update of snapshots for webview
markdevocht Jan 13, 2026
f2b9926
chore: upgrade adapter
noomorph Jan 13, 2026
c1a6cc4
more updates
markdevocht Jan 13, 2026
3d8218f
using xcode 26.1
markdevocht Jan 14, 2026
8f11d3d
Revert "chore: upgrade allure adapter"
markdevocht Jan 14, 2026
b84bf84
update of flaky test
markdevocht Jan 14, 2026
0a963f5
Merge branch 'feat/ios26' of github.com:wix/Detox into feat/ios26
markdevocht Jan 21, 2026
7e29c7f
Added launchArg 'skipDemoActiveNotification' handling so we don't nee…
markdevocht Jan 21, 2026
836d0d6
reversed logic
markdevocht Jan 21, 2026
b06daa7
update for tests
markdevocht Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .xcoderc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
16.1
26.1
8 changes: 2 additions & 6 deletions detox/test/e2e/06.device.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ describe('Device', () => {
});

it('launchApp({newInstance: true}) + sendToHome() + launchApp() - should bring up previous instance', async () => {
await device.launchApp({newInstance: true});
await device.launchApp({newInstance: true });
await element(by.text('Sanity')).tap();
await element(by.text('Say Hello')).tap();
await device.sendToHome();
Expand All @@ -71,9 +71,6 @@ describe('Device', () => {
};

await device.launchApp({newInstance: true, languageAndLocale});
// iOS toast is hiding the element
await waitFor(element(by.text('Language'))).toBeVisible().withTimeout(1000);

await element(by.text('Language')).tap();
await expect(element(by.text(`Current locale: ${languageAndLocale.locale}`))).toBeVisible();
await expect(element(by.text(`Current language: ${languageAndLocale.language}`))).toBeVisible();
Expand All @@ -84,8 +81,7 @@ describe('Device', () => {
};

await device.launchApp({newInstance: true, languageAndLocale});
await waitFor(element(by.text('Language'))).toBeVisible().withTimeout(1000);


await element(by.text('Language')).tap();
await expect(element(by.text(`Current locale: ${languageAndLocale.locale}`))).toBeVisible();
await expect(element(by.text(`Current language: ${languageAndLocale.language}`))).toBeVisible();
Expand Down
4 changes: 3 additions & 1 deletion detox/test/e2e/13.permissions.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { RESULTS } = require('react-native-permissions');
const { isIOS18OrHigher } = require('./utils/deviceInfo');

const BASIC_PERMISSIONS_TO_CHECK = [
'userTracking',
Expand Down Expand Up @@ -167,8 +168,8 @@
await expect(faceid).toHaveText(RESULTS.DENIED);
});

// todo: Skipped due to an error coming from react-native-permissions. Fix or implement a custom check.

Check warning on line 171 in detox/test/e2e/13.permissions.test.js

View workflow job for this annotation

GitHub Actions / Linux

Unexpected 'todo' comment without any conditions: 'todo: Skipped due to an error coming...'

Check warning on line 171 in detox/test/e2e/13.permissions.test.js

View workflow job for this annotation

GitHub Actions / Linux

Unexpected 'todo' comment without any conditions: 'todo: Skipped due to an error coming...'
it.skip('should grant permission', async () => {

Check warning on line 172 in detox/test/e2e/13.permissions.test.js

View workflow job for this annotation

GitHub Actions / Linux

Tests should not be skipped

Check warning on line 172 in detox/test/e2e/13.permissions.test.js

View workflow job for this annotation

GitHub Actions / Linux

Tests should not be skipped
const permissions = { faceid: 'YES' };

await device.launchApp({ permissions, delete: true });
Expand All @@ -183,7 +184,8 @@
await device.launchApp({ permissions, delete: true });
await element(by.text('Permissions')).tap();

await expect(faceid).toHaveText(RESULTS.BLOCKED);
// iOS 18+ changed behavior: FaceID permissions set to NO now return DENIED instead of BLOCKED
await expect(faceid).toHaveText(isIOS18OrHigher() ? RESULTS.DENIED : RESULTS.BLOCKED);
});
});
});
Expand Down
2 changes: 1 addition & 1 deletion detox/test/e2e/19.crash-handling.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('Crash Handling', () => {

it('Should recover from app crash', async () => {
await device.launchApp({ newInstance: false });
await expect(element(by.text('Sanity'))).toBeVisible();
await waitFor(element(by.text('Sanity'))).toBeVisible();
});

/**
Expand Down
4 changes: 2 additions & 2 deletions detox/test/e2e/20.background-foreground.transitions.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
describe(":ios: Background-Foreground Transitions", () => {
it("Backgrounding and foregrounding an app should wait for transition to finish", async () => {
await device.launchApp({newInstance: true});
await device.launchApp({newInstance: true, launchArgs: { demoShowActiveNotification: true }});
await device.sendToHome();
await expect(element(by.text("Background"))).toExist();
await device.launchApp({newInstance: false});
await device.launchApp({newInstance: false, launchArgs: { demoShowActiveNotification: true }});
await expect(element(by.text("Active"))).toExist();
});
});
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/cross-origin-frame.clear-text.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/elementScreenshot.horiz.ios.new-arch.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/elementScreenshot.horiz.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/elementScreenshot.vert.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/focus-on-input-webview.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/move-cursor-to-end-webview.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/scroll-to-view-webview.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified detox/test/e2e/assets/select-all-text-in-webview.ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions detox/test/e2e/detox.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ const config = {
type: 'ios.simulator',
headless: Boolean(process.env.CI),
device: {
type: 'iPhone 16 Pro Max',
os: '18.5'
type: 'iPhone 17 Pro',
os: '26.1'
},
},

Expand Down
56 changes: 56 additions & 0 deletions detox/test/e2e/utils/deviceInfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/**
* Utility to get device OS version information
*/

let cachedIOSVersion = null;

/**
* Gets the iOS major version number
* @returns {Promise<number|null>} The iOS major version (e.g., 17, 18, 26) or null if not iOS
*/
async function getIOSMajorVersion() {
if (cachedIOSVersion !== null) {
return cachedIOSVersion;
}

try {
const { device: deviceHandle } = require('detox');
if (deviceHandle && deviceHandle.getPlatform && deviceHandle.getPlatform() !== 'ios') {
cachedIOSVersion = null;
return null;
}

if (deviceHandle && deviceHandle._device && deviceHandle._device.deviceConfig) {
const osVersion = deviceHandle._device.deviceConfig.device?.os;
if (osVersion) {
const majorVersion = parseInt(osVersion.split('.')[0], 10);
cachedIOSVersion = majorVersion;
return majorVersion;
}
}
} catch (e) {
console.warn('Could not determine iOS version, assuming iOS 18+');
}

cachedIOSVersion = 18;
return cachedIOSVersion;
}

/**
* Checks if iOS version is 18 or higher
* @returns {Promise<boolean>}
*/
async function isIOS18OrHigher() {
const majorVersion = await getIOSMajorVersion();
if (majorVersion === null) {
return false;
}
return majorVersion >= 18;
}

module.exports = {
getIOSMajorVersion,
isIOS18OrHigher,
};


11 changes: 9 additions & 2 deletions detox/test/ios/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,18 @@ - (NSURL *) bundleURL {
@end
#endif

@interface AppDelegate () <UNUserNotificationCenterDelegate>
@interface AppDelegate () <UNUserNotificationCenterDelegate> {
BOOL demoShowActiveNotification;
}
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
demoShowActiveNotification = [[NSUserDefaults standardUserDefaults] boolForKey:@"demoShowActiveNotification"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"demoShowActiveNotification"];

#if REACT_NATIVE_VERSION_MAJOR == 0 && REACT_NATIVE_VERSION_MINOR >= 79
self.reactNativeDelegate = [ReactNativeDelegate new];
self.reactNativeFactory = [[RCTReactNativeFactory alloc] initWithDelegate:self.reactNativeDelegate];
Expand Down Expand Up @@ -121,7 +126,9 @@ - (void)handleChangeScreen:(NSNotification *)notification {
}

- (void)applicationDidBecomeActive:(NSNotification *)notification {
[self showOverlayMessageWithMessage:@"Active"];
if (demoShowActiveNotification) {
[self showOverlayMessageWithMessage:@"Active"];
}
}

- (void)applicationWillResignActive:(NSNotification *)notification {
Expand Down
Loading