diff --git a/android-types-internal.d.ts b/android-types-internal.d.ts index 60f1500db4..6a109454e0 100644 --- a/android-types-internal.d.ts +++ b/android-types-internal.d.ts @@ -31,7 +31,7 @@ export interface AndroidDevice exte open(command: string): Promise; installApk(file: string | Buffer, options?: { args?: string[] }): Promise; push(file: string | Buffer, path: string, options?: { mode?: number }): Promise; - launchBrowser(options?: BrowserContextOptions & { packageName?: string }): Promise; + launchBrowser(options?: BrowserContextOptions & { pkg?: string }): Promise; close(): Promise; wait(selector: AndroidSelector, options?: { state?: 'gone' } & { timeout?: number }): Promise; diff --git a/src/client/android.ts b/src/client/android.ts index 880a817e54..21220bf630 100644 --- a/src/client/android.ts +++ b/src/client/android.ts @@ -233,7 +233,7 @@ export class AndroidDevice extends ChannelOwner { + async launchBrowser(options: types.BrowserContextOptions & { pkg?: string } = {}): Promise { return this._wrapApiCall('androidDevice.launchBrowser', async () => { const contextOptions = await prepareBrowserContextOptions(options); const { context } = await this._channel.launchBrowser(contextOptions); diff --git a/src/dispatchers/androidDispatcher.ts b/src/dispatchers/androidDispatcher.ts index 993f18f7d7..dd3a2e7152 100644 --- a/src/dispatchers/androidDispatcher.ts +++ b/src/dispatchers/androidDispatcher.ts @@ -156,7 +156,7 @@ export class AndroidDeviceDispatcher extends Dispatcher { - const context = await this._object.launchBrowser(params.packageName, params); + const context = await this._object.launchBrowser(params.pkg, params); return { context: new BrowserContextDispatcher(this._scope, context) }; } diff --git a/src/protocol/channels.ts b/src/protocol/channels.ts index deb0610914..d4dedb5c68 100644 --- a/src/protocol/channels.ts +++ b/src/protocol/channels.ts @@ -2648,7 +2648,7 @@ export type AndroidDeviceInputDragOptions = { }; export type AndroidDeviceInputDragResult = void; export type AndroidDeviceLaunchBrowserParams = { - packageName?: string, + pkg?: string, ignoreHTTPSErrors?: boolean, javaScriptEnabled?: boolean, bypassCSP?: boolean, @@ -2693,7 +2693,7 @@ export type AndroidDeviceLaunchBrowserParams = { }, }; export type AndroidDeviceLaunchBrowserOptions = { - packageName?: string, + pkg?: string, ignoreHTTPSErrors?: boolean, javaScriptEnabled?: boolean, bypassCSP?: boolean, diff --git a/src/protocol/protocol.yml b/src/protocol/protocol.yml index 7210d52b4a..402e49c731 100644 --- a/src/protocol/protocol.yml +++ b/src/protocol/protocol.yml @@ -2236,7 +2236,7 @@ AndroidDevice: launchBrowser: parameters: - packageName: string? + pkg: string? ignoreHTTPSErrors: boolean? javaScriptEnabled: boolean? bypassCSP: boolean? diff --git a/src/protocol/validator.ts b/src/protocol/validator.ts index 78cf140633..210627e4ae 100644 --- a/src/protocol/validator.ts +++ b/src/protocol/validator.ts @@ -986,7 +986,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme { steps: tNumber, }); scheme.AndroidDeviceLaunchBrowserParams = tObject({ - packageName: tOptional(tString), + pkg: tOptional(tString), ignoreHTTPSErrors: tOptional(tBoolean), javaScriptEnabled: tOptional(tBoolean), bypassCSP: tOptional(tBoolean), diff --git a/src/server/android/android.ts b/src/server/android/android.ts index 0d163b400a..a682b0988b 100644 --- a/src/server/android/android.ts +++ b/src/server/android/android.ts @@ -31,6 +31,7 @@ import { Transport } from '../../protocol/transport'; import { RecentLogsCollector } from '../../utils/debugLogger'; import { TimeoutSettings } from '../../utils/timeoutSettings'; import { AndroidWebView } from '../../protocol/channels'; +import { CRPage } from '../chromium/crPage'; const readFileAsync = util.promisify(fs.readFile); @@ -267,10 +268,19 @@ export class AndroidDevice extends EventEmitter { const browser = await CRBrowser.connect(androidBrowser, browserOptions); const controller = new ProgressController(); + const defaultContext = browser._defaultContext!; await controller.run(async progress => { - await browser._defaultContext!._loadDefaultContextAsIs(progress); + await defaultContext._loadDefaultContextAsIs(progress); }); - return browser._defaultContext!; + { + // TODO: remove after rolling to r838157 + // Force page scale factor update. + const page = defaultContext.pages()[0]; + const crPage = page._delegate as CRPage; + await crPage._mainFrameSession._client.send('Emulation.setDeviceMetricsOverride', { mobile: false, width: 0, height: 0, deviceScaleFactor: 0 }); + await crPage._mainFrameSession._client.send('Emulation.clearDeviceMetricsOverride', {}); + } + return defaultContext; } webViews(): AndroidWebView[] { diff --git a/test/android/browser.spec.ts b/test/android/browser.spec.ts index bc71db1771..05f58c4a20 100644 --- a/test/android/browser.spec.ts +++ b/test/android/browser.spec.ts @@ -38,4 +38,14 @@ if (process.env.PW_ANDROID_TESTS) { await page.close(); await context.close(); }); + + it('should check', async function({ device }) { + const context = await device.launchBrowser(); + const [page] = context.pages(); + await page.setContent(``); + await page.check('input'); + expect(await page.evaluate(() => window['checkbox'].checked)).toBe(true); + await page.close(); + await context.close(); + }); } diff --git a/utils/avd_start.sh b/utils/avd_start.sh index d0d4356364..43ed4142c9 100755 --- a/utils/avd_start.sh +++ b/utils/avd_start.sh @@ -12,7 +12,7 @@ echo "Killing previous emulators" ${ANDROID_HOME}/platform-tools/adb devices | grep emulator | cut -f1 | while read line; do ${ANDROID_HOME}/platform-tools/adb -s $line emu kill; done echo "Starting emulator" -nohup ${ANDROID_HOME}/emulator/emulator -avd android30 -no-audio -no-snapshot & +nohup ${ANDROID_HOME}/emulator/emulator -avd android30 -no-audio -gpu swiftshader & ${ANDROID_HOME}/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' ${ANDROID_HOME}/platform-tools/adb devices echo "Emulator started" \ No newline at end of file