Включение / отключение Wi-Fi с помощью Xamarin UiTest

Я пытаюсь программно включить / отключить Wi-Fi в моем тесте Xamarin Ui.
Я уже нашел это: Android: как включить / отключить Wi-Fi или подключение к Интернету программно. Но, похоже, это не работает в UiTest.

Я тоже пробовал что-то вроде этого:

Context appContext = Android.App.Application.Context;
var wifiManager = (WifiManager)appContext.GetSystemService(Context.WifiService);
bool status = false;
wifiManager.SetWifiEnabled(status);

Первая строка (Android.App.Application.Context) выдает исключение:

Message: System.IO.FileNotFoundException : Could not load file or assembly 'Java.Interop, Version=0.1.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065' or one of its dependencies. The system cannot find the file specified.

Я использую следующие пространства имен:

using Android.Net.Wifi;
using Android.Content;

В моем проекте есть ссылка на Mono.Android.


person Franklin84    schedule 16.05.2018    source источник
comment
Добавьте это как метод в свой проект Xamarin.Android и представьте его как бэкдор, который вы можете вызвать через код UITest.   -  person SushiHangover    schedule 17.05.2018


Ответы (1)


Подход с бэкдором мне подходит.

Решение, которое мне подходит, представляло собой комбинацию:

1. Добавьте следующую строку в файл AndroidManifest.xml проекта Android:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

2 .: Добавьте следующие строки в MainActivity.cs проекта Android:

using Java.Interop;
using Android.Net.Wifi;

[Export("ChangeWifiState")]
public void ChangeWifiState(bool state)
{
    Context appContext = Android.App.Application.Context;
    var wifiManager = (WifiManager)appContext.GetSystemService(WifiService);
    wifiManager.SetWifiEnabled(state);
}

3. Вызов следующего метода из теста Xamarin Ui:

app.Invoke("ChangeWifiState", false);    // true to enable wifi, false to disable wifi

PS: Я использую Xamarin Forms. У меня есть четыре разных проекта: основной проект, проект Android, проект пользовательского интерфейса и тестовый проект.

Я только что нашел второе решение без использования реального приложения.
Он использует команды ADB для включения / отключения Wi-Fi:

        var process = new System.Diagnostics.Process();
        var startInfo = new System.Diagnostics.ProcessStartInfo
        {
            WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
            FileName = "cmd.exe",
            Arguments = "/C adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings adb shell input keyevent 19 & adb shell input keyevent 19 & adb shell input keyevent 23 & adb shell input keyevent 82 & adb shell input tap 500 1000"
        };
        process.StartInfo = startInfo;
        process.Start();

Это можно использовать без рутированного устройства :).
Объяснение шагов:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings открывает настройки Wi-Fi.
adb shell input keyevent 23 включает / отключает Wi-Fi.
Я не уверен, почему используется команда adb shell input keyevent 19, но она работает.
adb shell input keyevent 82 нажимает на меню кнопку, чтобы вернуться к исходному приложению.
adb shell input tap 500 1000 нажимает координату x = 500, y = 1000 (центр экрана). Это может потребоваться изменить для разных решений.
Источники для этого решения:

person Franklin84    schedule 17.05.2018
comment
По некоторым причинам это решение больше не работало правильно на моем новом Android 8.1. ‹Br› Поэтому я изменил две вещи: ‹br› 1. Замените keyevent 82 координатами кнопки меню (возможно, обновление безопасности 8.1) ‹Br› 2. Разделите большой аргумент на 3 маленьких (1: открыть настройки, 2: изменить статус, 3: вернуться в исходное приложение). - person Franklin84; 20.06.2018