Апплет WeChat
Аплет WeChat на самом деле представляет собой обычный веб-просмотр.,Но вам нужно открыть страницу отладки Х5 в Вичате для настроек.,Скрипт добавляет параметр androidProcess для выполнения автоматического тестирования.
Примеры в этой главе относятся к версии WeChat для Android (операции в средах Windows и Mac в основном одинаковы, а этот пример относится к среде Windows).
1. Сначала получите реальный идентификатор устройства и введите команду adb devices в командной строке.
2. Установите приложение WeChat на реальное устройство, введите команду установки adb install -r для установки или воспользуйтесь мобильным помощником для установки. Пример этой главы: WeChat версии 6.6.5.
3. Откройте страницу отладки X5.
Откройте WeChat, введите debugx5.qq.com в любом окне чата и нажмите, чтобы открыть.
Или отсканируйте QR-код ниже через WeChat, чтобы перейти на страницу отладки X5.
4. На информационной странице установите флажок «Включить функцию отладки инспектора ядра TBS».
5. Затем начните использовать инструмент позиционирования элемента для получения значения атрибута и другой информации об элементе, например, для собственного приложения WeChat вы можете использовать инструмент uiautomatorviewer из Android SDK, чтобы найти элемент. страница не может распознать элементы в веб-просмотре, например отображение android webkit.WebView, поэтому какой инструмент следует использовать для его поиска? Например: JD Shopping.
Далее откройте браузер Chrome на своем ПК и введите адрес доступа chrome://inspect/.
Как показано на рисунке, в данный момент открытым интерфейсом апплета является Webview.
Нажмите на ссылку страницы (там много ссылок, вам нужно щелкнуть одну за другой, чтобы увидеть, какая из них), появится новое окно, показывающее информацию об элементе Webview текущей страницы (из-за проблем с внутренней сетью первая страница для загрузки может потребоваться FANQIANG). Метод позиционирования элемента соответствует Selenium WebDriver.
6. Получить процесс текущего апплета
В WeChat много процессов, и каждая небольшая программа выполняется в отдельном процессе. Откройте мини-программу в WeChat (например: JD Shopping) и проверьте, какой процесс запущен в данный момент.
(1) Чтобы запросить pid, введите adb Shell dumpsys Activity Top findstr ACTIVITY в командной строке.
(2) Чтобы запросить текущий процесс апплета, введите adbshell ps в командной строке, чтобы запросить pid.
Добавлены параметры скрипта:
// Запустить Аплет WeChat, чтобы настроить здесь
// PID запроса, ввод командной строки adb shell dumpsys activity top | findstr ACTIVITY
// Запросить текущий Mini процесс программы, ввод командной строки adb shell ps Код запроса
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
7. Для переключения между NATIVE_APP и WEBVIEW_com.tencent.mm:tools используйте контекстный метод.
8. Код скрипта:
package com.test.weixin;
import java.net.URL;
import java.util.Set;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.android.AndroidKeyCode;
/**
* Апплет WeChat
*
* @author wangmcn
*
*/
public class Xiaochengxv {
public static void main(String[] args) throws Exception {
AndroidDriverdriver;
DesiredCapabilities capabilities = new DesiredCapabilities();
// Какую систему автоматического тестирования использовать
// По умолчанию — Appium, Selendroid, UiAutomator2, Espresso для Android или XCUITest для IOS;
capabilities.setCapability("automationName", "Appium");
// Какую платформу мобильной операционной системы использовать
// iOS, Android, FirefoxOS
capabilities.setCapability("platformName", "Android");
// Мобильная версия ОС
capabilities.setCapability("platformVersion", "6.0");
// Тип используемого мобильного устройства или эмулятора
// iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android
// Emulator, Galaxy S4 и т. д.
// В iOS значение этого ключевого слова должно быть с использованием `instruments -s Одно из доступных имен устройств, полученных с помощью devices`
// На Android это ключевое слово в настоящее время не работает.
capabilities.setCapability("deviceName", "honor");
// Уникальный идентификатор подключенного физического устройства.
capabilities.setCapability("udid", "MYV0215825000026");
// Имя пакета приложения Android, которое будет запущено.
capabilities.setCapability("appPackage", "com.tencent.mm");
// Android для загрузки из пакета название деятельности
capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
// Включите метод ввода Unicode. Установите значение true для ввода китайских символов. Значение по умолчанию — false.
capabilities.setCapability("unicodeKeyboard", true);
// После запуска тестов Unicode с набором ключевых слов `unicodeKeyboard` верните клавиатуру в исходное состояние.
// Если используется отдельно, оно будет игнорироваться, значение по умолчанию — false.
capabilities.setCapability("resetKeyboard", true);
// Установите значение true, чтобы перезаписывать сеанс при каждом его запуске, в противном случае при втором запуске будет сообщено об ошибке, и сеанс невозможно будет создать.
capabilities.setCapability("sessionOverride", true);
// Не сбрасывайте состояние приложения до этого сеанса.
// Android Не останавливайте приложение, не очищайте данные приложения и не удаляйте APK.
// IOS Не уничтожайте и не выключайте SIM-карту после тестирования. Запустите тестовый запуск при любом запуске моделирования или при подключенном устройстве.
capabilities.setCapability("noReset", true);
// Выполните полный сброс
// Android Остановите приложение, очистите данные приложения и удалите APK после тестирования.
// IOS Удалите приложение после тестирования на реальном устройстве и уничтожьте симулятор после тестирования на эмуляторе.
capabilities.setCapability("fullReset", false);
// Установить таймаут команды, единица измерения: секунды
// Когда период тайм-аута достигнут и новые команды не получены, Appium предположит, что клиент вышел, и автоматически завершит сеанс.
capabilities.setCapability("newCommandTimeout", 60);
// Запустить Аплет WeChat, чтобы настроить здесь
// PID запроса, ввод командной строки adb shell dumpsys activity top | findstr ACTIVITY
// Запросить текущий Mini процесс программы, ввод командной строки adb shell ps Код запроса
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("Запустить приложение Вичат");
Thread.sleep(10000);
// Нажмите, чтобы узнать
driver.findElementByXPath("//*[@text='find']").click();
Thread.sleep(5000);
// Слайд вниз
driver.swipe(170, 530, 170, 230, 1000);
Thread.sleep(2000);
// Нажмите Мини программа
driver.findElementByXPath("//*[@text='Мини программа']").click();
Thread.sleep(2000);
// Нажмите на JD.com, чтобы совершить покупку
driver.findElementByXPath("//*[contains(@text, 'JD Shopping')]").click();
Thread.sleep(8000);
Setcontexts = driver.getContextHandles();
for (String context : contexts) {
// Распечатайте его, чтобы увидеть, какие контексты существуют.
System.out.println(context);
}
// Переключитесь в режим веб-просмотра, чтобы найти веб-элементы.
driver.context("WEBVIEW_com.tencent.mm:tools");
// Получить дескриптор текущего окна
String Handle = driver.getWindowHandle();
System.out.println("Текущий дескриптор: " + Handle);
// Получить дескрипторы всех окон
SetHandles = driver.getWindowHandles();
for (String h : Handles) {
if (h.equalsIgnoreCase(Handle)) {
System.out.println("Игнорировать ручки: " + h);
} else {
driver.switchTo().window(h);
System.out.println("Перейти к ручке: " + h);
// Распечатать исходный код текущей веб-страницы
System.out.println("дескриптор " + h + " Исходный код веб-страницы: " + driver.getPageSource());
}
}
// Нажмите, чтобы получить купон
driver.findElementByXPath("//wx-view[text()='Получить купон']").click();
Thread.sleep(5000);
// возвращаться
driver.pressKeyCode(AndroidKeyCode.BACK);
// Переключиться в режим приложения
driver.context("NATIVE_APP");
Thread.sleep(5000);
// Нажмите, чтобы классифицировать
driver.findElementByXPath("//android.widget.TextView[@text='Классификация']").click(); Thread.sleep(5000);
driver.quit();
}
}
1. Запускаем сервис Appium (выбираем любой)
Способ 1: запустить сервер Appium
Откройте командную строку и введите appium --address 127.0.0.1 --port 4723 --no-reset --session-override
Как показано на рисунке, служба Appium запущена.
Способ 2: откройте рабочий стол Appium
Открыть рабочий стол Appium
Если IP-адрес и порт службы указаны по умолчанию, нажмите «Запустить сервер v1.6.5», чтобы запустить службу Appium, как показано на рисунке.
2. Выполните тестовый скрипт, этапы выполнения скрипта:
(1) Запустите приложение WeChat.
(2) Нажмите, чтобы узнать
(3) Сдвинуть вниз
(4) Нажмите на мини-программу.
(5) Нажмите JD.com, чтобы совершить покупку.
(6) Распечатайте NATIVE_APP и WEBVIEW тестируемого приложения.
NATIVE_APP
WEBVIEW_com.tencent.mm:appbrand1
WEBVIEW_com.tencent.mm:appbrand0
WEBVIEW_com.tencent.mm:support
WEBVIEW_com.tencent.mm:tools
WEBVIEW_com.huawei.wifiprobqeservice
WEBVIEW_com.iflytek.ringdiyclient
(7) Переключитесь на WEBVIEW_com.tencent.mm:tools (режим веб-просмотра), чтобы найти веб-элементы.
(8) Получить дескриптор текущего окна
(9) Получите дескрипторы всех окон.
Поскольку существует несколько дескрипторов, вам нужно перейти к правильному дескриптору, чтобы управлять элементами страницы, и каждый раз, когда это выполняется, значение дескриптора изменяется и не фиксируется.
Первое исполнение:
Текущий дескриптор: CDwindow-a7bc4687-2728-4d5b-af91-c310951d7247.
Игнорировать дескриптор: CDwindow-a7bc4687-2728-4d5b-af91-c310951d7247
Перейти к дескриптору: CDwindow-ac347a13-7a97-4c96-8867-901e1b8888f3
Второе исполнение:
Текущий дескриптор: CDwindow-8b216eef-9ccc-425b-af36-291ff4d98cc8
Игнорировать дескриптор: CDwindow-8b216eef-9ccc-425b-af36-291ff4d98cc8
Перейти к дескриптору: CDwindow-27615809-988a-4533-a441-01ab63e0d968.
(10) Распечатайте исходный код текущей веб-страницы.
(11) Нажмите, чтобы получить купоны
(12) Возврат
(13) Переключитесь на NATIVE_APP (режим приложения)
(14) Нажмите, чтобы классифицировать
(15) Закройте приложение WeChat.
После завершения выполнения скрипта на консоли выводится информация:
3. При выполнении тестового скрипта перехода в режим WebView могут возникнуть некоторые ошибки. Исключая некорректное позиционирование элементов, большая часть ошибок вызвана несоответствием версий WebView и драйвера.
Например, сообщается о следующей ошибке, указывающей на то, что при обработке команды произошла неизвестная ошибка на стороне сервера. Исходная ошибка: исключение сеанса не создано.
from unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"22596.1","isDefault":true},"id":1,"name":"","origin":"://"}
Решение состоит в том, чтобы сопоставить версию WebView с версией драйвера и позволить драйверу перейти на более раннюю версию или обновиться.
Итак, как узнать, совпадают ли WebView и драйвер?
Откройте браузер Chrome на ПК и введите адрес доступа chrome://inspect/.
В реальной машине с udid MYV0215825000026,Откройте страницу приложения WeChatwebview, которой вы хотите управлять.,В настоящее время вы можете увидеть ссылку для доступа в браузере Chrome на ПК.,Как показано на картинке,Номер версии WebView на реальной машине — 57.0.2987.132.
Теперь, когда известен номер версии WebView тестируемого приложения, следующим шагом будет определение сопоставляемой версии драйвера и ее соответствия версии chromedriver.
Адрес загрузки исторической версии Chromedriver: https://chromedriver.storage.googleapis.com/index.html.
Соответствующий список версий Chrome, поддерживаемых версией chromedriver:
Выберите указанную версию chromedriver (на фото: версия WebView — 57.0.2987.132, поэтому выбрана версия chromedriver 2.28). Вы можете скачать указанный chromedriver для разных платформ (Win, Mac, Linux).
После загрузки указанного chromedriver дважды щелкните, чтобы просмотреть номер версии драйвера.
Где следует разместить хромдрайвер? В зависимости от службы Appium, которую вы хотите использовать, скопируйте ее в соответствующий каталог Appium Server или Appium Desktop. После завершения копирования его можно использовать в обычном режиме.
В среде Windows:
Путь chromedriver сервера Appium, например:
C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe
Путь chromedriver Appium Desktop, например:
C:\Users\Administrator\AppData\Local\Programs\appium-desktop\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe
В среде Mac:
Обратите внимание, что когда служба Appium использует Appium Server, при выполнении сценария сообщается об ошибке: При обработке команды произошла неизвестная ошибка на стороне сервера. Исходная ошибка: попытка использовать двоичный файл chromedriver по пути /usr/local/lib/node_modules. /appium/node_modules/appium-chromedriver/chromedriver/mac/chromedriver, но его не существует!
Это означает, что драйвер chromedriver не найден. Создайте соответствующий каталог в соответствии с сообщением об ошибке и скопируйте драйвер chromedriver в указанное место.
Путь chromedriver сервера Appium, например:
/usr/local/lib/node_modules/appium/node_modules/appium-chromedriver/chromedriver/mac/chromedriver
Путь chromedriver Appium Desktop, например:
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-chromedriver/chromedriver/mac/chromedriver