Как перейти на WebView Android используя Appium (Java)?

Есть приложение на #android Страница логина - WebView, дальше Hybrid app.
Все настройки делала под Hybrid app (WebView добавили недавно), каким образом и где определить переключение на WebView?

Создала класс:

 public void changeToWebview() { getDriver().context("WEBVIEW"); }

и обращаюсь к нему из шагов уже:

@Given("^I'm on a startup screen$")
    public void verifyISeeStartupScreen() throws Throwable {
        System.out.println("I am on startup screen");
        loginPage.changeToWebview();
        loginPage.waitForPageVisible();
        throw new PendingException();
    }

Как я поняла структуру при запуске:
устанавливается приложение,
открывается страница login (WebView),
переход на WebView (в коде),
wait (уже основываясь на локаторы)
работа с локаторами.

Может, не ясно что-то выложила и не так прописала - только начинаю с автоматизацией так что буду рада советам и рекомендациям :slight_smile:

Переключение в webView контекст лучше делать неявно (не в тестах). А в самом тесте лучше использовать методы пейджи, например

   loginPage.loginAs(validUser);

А переключение контекста скрыть в этот метод:

public HomePage loginAs(User user) {
  switchToContext(WEB_VIEW);
  //some actions
  switchToContext(NATIVE_APP);
  return new HomePage();
}

Но стоит заметить, что часто webView элементы, особенно в Android, видны и в нативном контексте. Проверьте в Аппиум-инспекторе, возможно, Вам и не придется делать это переключение между Web View и Native App.

2 лайка

Appium инспектор не находит ничего :frowning:
Попробую этот способ, спасибо!

Во-первых посмотрите что вам возвращает getContext()
Ибо у меня контекс для вебвью возвращается с таким именем - “WEBVIEW_1”
Во-вторых я бы советовал для инспекции элементов андроида юзать что-то родное из AndroidSDK, например утилитку monitor
На форуме даже есть тема с обсуждением таким - Получение локаторов элементов для appium - #3 от пользователя evgmoskalenko

2 лайка

Вот очень нужный ответ! :slight_smile: Только столкнулась с этим моментом : как же записать WEBVIEW, что б это распозналось, где я могу это посмотреть?
Я использую monitor для инспекции.

Эээмм, простите, но не очень понял вопроса. Перефразируйте плиз)

Как это увидеть?

Ну как то так в джаве наверное

string context = driver.getContext();

Ну и распечатайте куда-нибудь это значение или дебагером посмотрите, что там возвращается.

Это верно. Он также может иметь вид WEBVIEW_2, WEBVIEW_3 и т.д. Поэтому в случае с WebView контекст нужно предварительно найти:

  String webView = driver.getContextHandles()
                .stream()
                .filter(c -> c.contains(WEB))
                .findAny()
                .orElseThrow(ContextNotFoundException::new);

А затем уже делать переключение:

   driver.context(webView);
1 лайк

А если у меня возвращает [NATIVE_APP] (но класс страницы WebView…)? что делать?

А в этом классе нет нужных вам элементов?
А то может тогда стоит последовать совету

Appium inspector не работает у меня)
Через uiautomatorviewer, страница отображается одним классом (WebView) без каких-либо элементов. К ним (элементам) могу добраться только через monitor. При попытке запустить тест без переключений выдает ошибку " NoSuchElementException: Can’t locate an element by this strategy: [unknown locator] " -

Ну пусть через monitor, то что он вам показывает работайте с этими элементами через native_view
Я на этот момент хотел обратить ваше внимание, а не на инспектора :slight_smile:

Дело в том, что в нем не было установлено вот это:

Обратилась к программистам и они изменили чуток код и выдали новый файл.
Сейчас получила новый билд с возможностью дебаггинга. И в ответе уже отображается WEBVIEW_com…
Буду пробовать тест запускать и отпишусь помогли ли изменения в коде.

С этим справилась, появился другой вопрос:
объявление локаторов происходило следующим образом
@AndroidFindBy (id = “verify_user_btn”)
public MobileElement nextBtn;

Каким образом их объявлять для webview (не смогла в интернете найти)?

А как у вас объявлено не работает?

нет(
пробовала так:

 @FindBy(id = "userName")
    public WebElement mail;

тоже не работает…
Выдает ошибку в этих случаях:

org.openqa.selenium.WebDriverException: unknown error: log type 'logcat' not found

Вот ищу, что с этим делать.

Поправочка:
с описанным в этом комментарии вариантом работает, хоть и выдает ошибку (уже после взаимодействия).

Интересно при чем здесь logcat?
Вы в коде нигде не пытаетесь получить какие-нибудь логи с помощью драйвера?

В том то и дело, что нет((

Я работаю с Cucumber и подобные ошибки получаю в связи с
throws Throwable и throw new PendingException();
Как только игнорирую это - работает…)

Ну тогда заводите отдельную тему
Я с “огурцом” не работал и такой проблемы у себя не встречал

1 лайк