Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 6 additions & 2 deletions packages/wdio-utils/src/envDetector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,13 +199,17 @@ function isAndroid(capabilities?: WebdriverIO.Capabilities) {
return false
}

return Boolean(
const hasAndroidPlatform = Boolean(
(capabilities.platformName && capabilities.platformName.match(/Android/i)) ||
(/Android/i.test(bsOptions.platformName || '')) ||
(/Android/i.test(bsOptions.browserName || '')) ||
(/Samsung/i.test(bsOptions.deviceName || '')) ||
(capabilities.browserName && capabilities.browserName.match(/Android/i))
)

const deviceName = bsOptions.deviceName || ''
const hasAndroidDeviceName = /android|galaxy|pixel|nexus|oneplus|lg|htc|motorola|sony|huawei|vivo|oppo|xiaomi|redmi|realme|samsung/i.test(deviceName)

return Boolean(hasAndroidPlatform || hasAndroidDeviceName)
}

/**
Expand Down
187 changes: 187 additions & 0 deletions packages/wdio-utils/tests/envDetector.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,193 @@ describe('sessionEnvironmentDetector', () => {
const { isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isAndroid).toEqual(true)
})

it('should detect Android by device name in bstack:options using sessionEnvironmentDetector', () => {
expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'Samsung Galaxy S21' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'Google Pixel 7' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'OnePlus 9 Pro' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'Nexus 5X' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)
})

it('should detect Android by device name in bstack:options using capabilitiesEnvironmentDetector', () => {
expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'Samsung Galaxy S21' }
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'Google Pixel 7' }
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'OnePlus 9 Pro' }
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'Nexus 5X' }
}).isAndroid).toBe(true)
})

it('should detect Android by various manufacturer device names with sessionEnvironmentDetector', () => {
const androidDevices = [
'LG G8',
'HTC One',
'Motorola Edge',
'Sony Xperia',
'Huawei P30',
'Vivo V21',
'Oppo Find X3',
'Xiaomi Mi 11',
'Redmi Note 10',
'Realme GT',
'Samsung Galaxy Note'
]

androidDevices.forEach(deviceName => {
expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName } },
requestedCapabilities: {}
}).isAndroid).toBe(true)
})
})

it('should detect Android by various manufacturer device names with capabilitiesEnvironmentDetector', () => {
const androidDevices = [
'LG G8',
'HTC One',
'Motorola Edge',
'Sony Xperia',
'Huawei P30',
'Vivo V21',
'Oppo Find X3',
'Xiaomi Mi 11',
'Redmi Note 10',
'Realme GT',
'Samsung Galaxy Note'
]

androidDevices.forEach(deviceName => {
expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName }
}).isAndroid).toBe(true)
})
})

it('should not detect Android for non-Android device names with sessionEnvironmentDetector', () => {
const nonAndroidDevices = [
'iPhone 13',
'iPad Pro',
'iPhone SE',
'iPad Mini',
'Desktop Chrome',
'MacBook Pro'
]

nonAndroidDevices.forEach(deviceName => {
expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName } },
requestedCapabilities: {}
}).isAndroid).toBe(false)
})
})

it('should not detect Android for non-Android device names with capabilitiesEnvironmentDetector', () => {
const nonAndroidDevices = [
'iPhone 13',
'iPad Pro',
'iPhone SE',
'iPad Mini',
'Desktop Chrome',
'MacBook Pro'
]

nonAndroidDevices.forEach(deviceName => {
expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName }
}).isAndroid).toBe(false)
})
})

it('should detect Android case-insensitively by device name with both detectors', () => {
expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'SAMSUNG GALAXY S21' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'google pixel 7' }
}).isAndroid).toBe(true)

expect(sessionEnvironmentDetector({
capabilities: { 'bstack:options': { deviceName: 'Galaxy S22' } },
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector({
'bstack:options': { deviceName: 'ONEPLUS 10' }
}).isAndroid).toBe(true)
})

it('should detect Android when both platform and device name are present', () => {
const capabilities = {
platformName: 'Android',
'bstack:options': { deviceName: 'Samsung Galaxy S21' }
}

expect(sessionEnvironmentDetector({
capabilities,
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector(capabilities).isAndroid).toBe(true)
})

it('should detect Android when only device name is present without platform', () => {
const capabilities = { 'bstack:options': { deviceName: 'Pixel 7' } }

expect(sessionEnvironmentDetector({
capabilities,
requestedCapabilities: {}
}).isAndroid).toBe(true)

expect(capabilitiesEnvironmentDetector(capabilities).isAndroid).toBe(true)
})

it('should handle empty deviceName in bstack:options', () => {
const capabilities = { 'bstack:options': { deviceName: '' } }

expect(sessionEnvironmentDetector({
capabilities,
requestedCapabilities: {}
}).isAndroid).toBe(false)

expect(capabilitiesEnvironmentDetector(capabilities).isAndroid).toBe(false)
})

it('should handle missing deviceName in bstack:options', () => {
const capabilities = { 'bstack:options': {} }

expect(sessionEnvironmentDetector({
capabilities,
requestedCapabilities: {}
}).isAndroid).toBe(false)

expect(capabilitiesEnvironmentDetector(capabilities).isAndroid).toBe(false)
})
})

it('isSeleniumStandalone', () => {
Expand Down