Вопрос или проблема
У меня возникает ошибка при объявлении объекта страницы в тестовом классе, как показано в коде ниже. Когда я объявляю объект страницы в тестовом методе, это работает прекрасно, что, я думаю, неправильно.
package test;
import org.junit.jupiter.api.DisplayName;
import org.testng.Assert;
import org.testng.annotations.Test;
import screens.SmlHomeScreen;
public class LoginTest extends BaseTest {
SmlHomeScreen smlHomeScreen = new SmlHomeScreen();
@Test
@DisplayName("Должен успешно войти в приложение")
public void loginTest() throws InterruptedException {
loginScreen.signIn(configProperty.getUsername(), configProperty.getPassword());
Assert.assertTrue(smlHomeScreen.getSmlScreenContent().isDisplayed());
}
}
Я получаю эту ошибку:
Произошла неизвестная ошибка на стороне сервера при обработке команды. Оригинальная ошибка: 'POST /element' не может быть перенаправлен на сервер UiAutomator2, потому что процесс инструментирования не работает (вероятно, завершился аварийно). Проверьте журнал сервера и/или вывод logcat для получения дополнительной информации.
org.openqa.selenium.WebDriverException: Произошла неизвестная ошибка на стороне сервера при обработке команды. Оригинальная ошибка: 'POST /element' не может быть перенаправлен на сервер UiAutomator2, потому что процесс инструментирования не работает (вероятно, завершился аварийно). Проверьте журнал сервера и/или вывод logcat для получения дополнительной информации
Информация о сборке: версия: '4.25.0', ревизия: '8a8aea2337'
Информация о системе: os.name: 'Mac OS X', os.arch: 'aarch64', os.version: '14.6', java.version: '23'
Но если я объявляю его в тестовом методе, как ниже, это работает прекрасно
package test;
import org.junit.jupiter.api.DisplayName;
import org.testng.Assert;
import org.testng.annotations.Test;
import screens.SmlHomeScreen;
public class LoginTest extends BaseTest {
@Test
@DisplayName("Должен успешно войти в приложение")
public void loginTest() throws InterruptedException {
loginScreen.signIn(configProperty.getUsername(), configProperty.getPassword());
SmlHomeScreen smlHomeScreen = new SmlHomeScreen();
Assert.assertTrue(smlHomeScreen.getSmlScreenContent().isDisplayed());
}
}
Я также попытался объявить все страницы в своем BaseTest
следующим образом:
package test;
import org.junit.jupiter.api.BeforeAll;
import org.testng.annotations.*;
import screens.HomeScreen;
import screens.LoginScreen;
import screens.SmlHomeScreen;
import utils.ConfigProperty;
import utils.Driver;
public class BaseTest extends Driver {
protected LoginScreen loginScreen;
protected ConfigProperty configProperty;
protected HomeScreen homeScreen;
protected SmlHomeScreen smlHomeScreen;
@BeforeMethod
public void preTest() {
loginScreen = new LoginScreen();
homeScreen = new HomeScreen();
smlHomeScreen = new SmlHomeScreen();
configProperty = new ConfigProperty();
}
Я получаю ту же ошибку, что и раньше. Это исключение webdriver, и мне трудно это исправить. Пожалуйста, помогите
org.openqa.selenium.WebDriverException: Произошла неизвестная ошибка на стороне сервера при обработке команды. Оригинальная ошибка: 'POST /element' не может быть перенаправлен на сервер UiAutomator2, потому что процесс инструментирования не работает (вероятно, завершился аварийно). Проверьте журнал сервера и/или вывод logcat для получения дополнительной информации
Информация о сборке: версия: '4.25.0', ревизия: '8a8aea2337'
Информация о системе: os.name: 'Mac OS X', os.arch: 'aarch64', os.version: '14.6', java.version: '23'
Информация о драйвере: io.appium.java_client.android.AndroidDriver
Команда: [084af3d7-627c-40e7-af94-c26e0b032d37, findElement {using=-android uiautomator, value=new UiSelector().text("Login").instance(1)}]
Ответ или решение
Когда вы сталкиваетесь с ошибкой в тестах Appium при объявлении объекта страницы в классе теста, это может быть связано с различными причинами. Рассмотрим вашу ситуацию более детально, чтобы выявить потенциальные проблемы и предложить пути их решения.
Анализ проблемы
Ваша проблема заключается в том, что при объявлении SmlHomeScreen
на уровне класса, вы получаете ошибку:
An unknown server-side error occurred while processing the command. Original error: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed).
В то время как, если вы объявляете SmlHomeScreen
внутри метода теста, все работает корректно. Это может указывать на ошибку инициализации объектов или состояние драйвера.
Потенциальные причины ошибки
-
Инициализация объектов:
При инициализацииSmlHomeScreen
на уровне класса, возможно, вы еще не инициализировали необходимые зависимости, такие как самDriver
. Если объектsmlHomeScreen
доступен вне метода теста, он может быть недоступен до тех пор, пока не выполнится метод@BeforeMethod
, который устанавливает все необходимые контексты. -
Состояние драйвера:
ЕслиAppium driver
не готов к взаимодействию, когда вы вызываете методы объекта страницы, это может привести к ошибке. При инициализации объектов на уровне класса может произойти попытка обращения к UI элементов, даже если драйвер еще не полностью готов. -
Синхронизация:
Возможно, ваш тест обращается к элементам UI до того, как они становятся доступны, что может вызывать сбой. В таких случаях использование ожидающих механизмов (например,WebDriverWait
) может помочь.
Рекомендации по решениям
- Инициализация объектов:
Убедитесь, что вы создаете экземпляры объектов страниц в методе@BeforeMethod
вашегоBaseTest
, потому что именно там вы устанавливаете состояние драйвера.
@BeforeMethod
public void preTest() {
loginScreen = new LoginScreen();
homeScreen = new HomeScreen();
smlHomeScreen = new SmlHomeScreen();
configProperty = new ConfigProperty();
}
Это гарантирует, что все объекты и зависимости корректно инициализированы перед выполнением теста.
-
Проверка состояния драйвера:
Добавьте логику для проверки состояния вашего драйвера перед взаимодействиями с элементами. Это можно сделать, например, с помощьюWebDriverWait
, чтобы убедиться, что ваше приложение полностью загружено. -
Логгирование и дебаг:
Следующий шаг – просмотреть логи Appium и logcat на предмет причин сбоя. Это может дать вам представление о том, что именно происходит в момент возникновения ошибки. -
Изоляция тестов:
Если проблема сохраняется, попробуйте изолировать тест, чтобы проверить, не возникает ли проблема из-за состояния или данных, оставшихся от предыдущих тестов.
Заключение
Основные причины проблемы заключаются в инициализации объектов, состоянии драйвера и необходимости проверки доступности UI элементов перед их использованием. Убедитесь, что объекты и драйвер правильно инициализируются перед выполнением теста. Глубокая проверка логов и использование ожидающих механизмов поможет вам устранить проблемы с взаимодействием. Надеюсь, данные рекомендации окажутся полезными для решения вашей проблемы с Appium.