Контекст Webview больше не отображается при тестировании с использованием Appium

#selenium-webdriver #webdriver #selenium-chromedriver #appium #appium-android

#selenium-webdriver #webdriver #selenium-chromedriver #appium #appium-android

Вопрос:

Я создаю тест автоматизации с использованием Appium и webdriverio:

 const wdio = require("webdriverio");

const opts = {
    path: "/wd/hub",
    port: 4723,
    capabilities: {
        platformName: "Android",
        platformVersion: "11",
        deviceName: "Android Emulator",
        app: "/path/to/myapk.apk",
        automationName: "UiAutomator2",
        autoGrantPermissions: true
    }
};

async function main() {
    const driver = await wdio.remote(opts);

    const contexts = await driver.getContexts();
    console.log("Contexts:", contexts);

    await driver.deleteSession();
}

main();
 

Проблема

При выполнении тестов я мог видеть, что раньше у меня было два контекста:

  • NATIVE_APP
  • WEBVIEW_chrome (или аналогично, я не помню точное значение здесь)

Затем я внес изменение, которое переключило контексты на webview, и там я получил сообщение об ошибке о том, что драйвер Chrome не найден. Именно тогда я его установил : npm install "appium-chromedriver" .

Я не знаю, из-за этого ли все пошло прахом, но с тех пор, каждый раз, когда я тестирую, я вижу только собственный контекст, больше никакого контекста webview: (

Подробная информация

Важно отметить, что я изменил свое приложение для Android, чтобы включить это:

 @Override
public void onCreate() {
    super.onCreate();

    WebView.setWebContentsDebuggingEnabled(true);
}
 

Я также могу запустить chrome://inspect и увидеть, что webview есть, и даже проверить его. Но при выполнении тестов драйвер не может видеть контекст webview.

Почему? Как это исправить?

Ответ №1:

Оказывается, мне нужно дождаться появления webview в приложении, так что это работает:

 async function main() {
    const driver = await wdio.remote(opts);

    // Wait a few seconds so the webview properly loads
    await new Promise(resolve => setTimeout(resolve, 5000));

    const contexts = await driver.getContexts();
    console.log("Contexts:", contexts);

    await driver.deleteSession();
}