Объявление объекта страницы в тестовом классе вызывает следующую ошибку – Appium

Вопрос или проблема

У меня возникает ошибка при объявлении объекта страницы в тестовом классе, как показано в коде ниже. Когда я объявляю объект страницы в тестовом методе, это работает прекрасно, что, я думаю, неправильно.

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 внутри метода теста, все работает корректно. Это может указывать на ошибку инициализации объектов или состояние драйвера.

Потенциальные причины ошибки

  1. Инициализация объектов:
    При инициализации SmlHomeScreen на уровне класса, возможно, вы еще не инициализировали необходимые зависимости, такие как сам Driver. Если объект smlHomeScreen доступен вне метода теста, он может быть недоступен до тех пор, пока не выполнится метод @BeforeMethod, который устанавливает все необходимые контексты.

  2. Состояние драйвера:
    Если Appium driver не готов к взаимодействию, когда вы вызываете методы объекта страницы, это может привести к ошибке. При инициализации объектов на уровне класса может произойти попытка обращения к UI элементов, даже если драйвер еще не полностью готов.

  3. Синхронизация:
    Возможно, ваш тест обращается к элементам UI до того, как они становятся доступны, что может вызывать сбой. В таких случаях использование ожидающих механизмов (например, WebDriverWait) может помочь.

Рекомендации по решениям

  1. Инициализация объектов:
    Убедитесь, что вы создаете экземпляры объектов страниц в методе @BeforeMethod вашего BaseTest, потому что именно там вы устанавливаете состояние драйвера.
@BeforeMethod
public void preTest() {
    loginScreen = new LoginScreen();
    homeScreen = new HomeScreen();
    smlHomeScreen = new SmlHomeScreen();
    configProperty = new ConfigProperty();
}

Это гарантирует, что все объекты и зависимости корректно инициализированы перед выполнением теста.

  1. Проверка состояния драйвера:
    Добавьте логику для проверки состояния вашего драйвера перед взаимодействиями с элементами. Это можно сделать, например, с помощью WebDriverWait, чтобы убедиться, что ваше приложение полностью загружено.

  2. Логгирование и дебаг:
    Следующий шаг – просмотреть логи Appium и logcat на предмет причин сбоя. Это может дать вам представление о том, что именно происходит в момент возникновения ошибки.

  3. Изоляция тестов:
    Если проблема сохраняется, попробуйте изолировать тест, чтобы проверить, не возникает ли проблема из-за состояния или данных, оставшихся от предыдущих тестов.

Заключение

Основные причины проблемы заключаются в инициализации объектов, состоянии драйвера и необходимости проверки доступности UI элементов перед их использованием. Убедитесь, что объекты и драйвер правильно инициализируются перед выполнением теста. Глубокая проверка логов и использование ожидающих механизмов поможет вам устранить проблемы с взаимодействием. Надеюсь, данные рекомендации окажутся полезными для решения вашей проблемы с Appium.

Оцените материал
Добавить комментарий

Капча загружается...