Skip to content

Commit f2fab90

Browse files
committed
feat(ios): implement custom screenshot resizing with screenshotResizeRatio option
1 parent 99826e0 commit f2fab90

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

packages/android/tests/unit-test/page.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,13 @@ describe('AndroidDevice', () => {
239239
const customDevice = new AndroidDevice('test-device', {
240240
screenshotResizeRatio: 0.5,
241241
});
242-
242+
243243
vi.spyOn(customDevice, 'size').mockResolvedValue({
244244
width: 1080,
245245
height: 1920,
246246
dpr: 2,
247247
});
248-
248+
249249
const mockBuffer = Buffer.from('test-screenshot');
250250
mockAdb.takeScreenshot.mockResolvedValue(mockBuffer);
251251
vi.spyOn(customDevice, 'getAdb').mockResolvedValue(mockAdb);
@@ -294,13 +294,13 @@ describe('AndroidDevice', () => {
294294
const customDevice = new AndroidDevice('test-device', {
295295
screenshotResizeRatio: undefined,
296296
});
297-
297+
298298
vi.spyOn(customDevice, 'size').mockResolvedValue({
299299
width: 1080,
300300
height: 1920,
301301
dpr: 2,
302302
});
303-
303+
304304
const mockBuffer = Buffer.from('test-screenshot');
305305
mockAdb.takeScreenshot.mockResolvedValue(mockBuffer);
306306
vi.spyOn(customDevice, 'getAdb').mockResolvedValue(mockAdb);

packages/ios/src/device.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ import {
2020
import { sleep } from '@midscene/core/utils';
2121
import { DEFAULT_WDA_PORT } from '@midscene/shared/constants';
2222
import type { ElementInfo } from '@midscene/shared/extractor';
23-
import { createImgBase64ByFormat } from '@midscene/shared/img';
23+
import {
24+
createImgBase64ByFormat,
25+
resizeAndConvertImgBuffer,
26+
} from '@midscene/shared/img';
2427
import { getDebug } from '@midscene/shared/logger';
2528
import { WDAManager } from '@midscene/webdriver';
2629
import { IOSWebDriverClient as WebDriverAgentBackend } from './ios-webdriver-client';
@@ -37,6 +40,7 @@ export type IOSDeviceOpt = {
3740
wdaPort?: number;
3841
wdaHost?: string;
3942
useWDA?: boolean;
43+
screenshotResizeRatio?: number;
4044
} & IOSDeviceInputOpt;
4145

4246
export class IOSDevice implements AbstractInterface {
@@ -353,7 +357,36 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
353357
async screenshotBase64(): Promise<string> {
354358
debugDevice('Taking screenshot via WDA');
355359
try {
360+
const { width, height } = await this.size();
356361
const base64Data = await this.wdaBackend.takeScreenshot();
362+
363+
// Apply custom resize ratio if specified
364+
const resizeRatio = this.options?.screenshotResizeRatio ?? 1.0;
365+
366+
if (resizeRatio !== 1.0) {
367+
debugDevice(`Applying custom resize ratio: ${resizeRatio}`);
368+
const targetWidth = Math.round(width * resizeRatio);
369+
const targetHeight = Math.round(height * resizeRatio);
370+
debugDevice(`Target size: ${targetWidth}x${targetHeight}`);
371+
372+
const screenshotBuffer = Buffer.from(base64Data, 'base64');
373+
const { buffer, format } = await resizeAndConvertImgBuffer(
374+
'png',
375+
screenshotBuffer,
376+
{
377+
width: targetWidth,
378+
height: targetHeight,
379+
},
380+
);
381+
382+
const result = createImgBase64ByFormat(
383+
format,
384+
buffer.toString('base64'),
385+
);
386+
debugDevice('Screenshot taken and resized successfully');
387+
return result;
388+
}
389+
357390
const result = createImgBase64ByFormat('png', base64Data);
358391
debugDevice('Screenshot taken successfully');
359392
return result;

0 commit comments

Comments
 (0)