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

appium
android
java
Теги: #<Tag:0x00007fedb98a80a0> #<Tag:0x00007fedb98ab110> #<Tag:0x00007fedb98ab318>

(Aleksey Ilyenko) #2

Переключение в 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.


(Hanna Kliachkovska) #3

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


(Константин) #4

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


(Hanna Kliachkovska) #5

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


(Константин) #6

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


(Hanna Kliachkovska) #7

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


(Константин) #8

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

string context = driver.getContext();

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


(Aleksey Ilyenko) #9

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

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

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

   driver.context(webView);

(Hanna Kliachkovska) #10

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


(Константин) #11

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


(Hanna Kliachkovska) #12

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


(Константин) #13

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


(Hanna Kliachkovska) #14

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


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


(Hanna Kliachkovska) #15

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

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


(Константин) #16

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


(Hanna Kliachkovska) #17

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

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

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

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

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

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


(Константин) #18

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


(Hanna Kliachkovska) #19

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

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


(Константин) #20

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


(Hanna Kliachkovska) #21

Относительно решения:

  1. Изменила билд на тот, который поддерживал дебаггинг (разработчики подправили и выдали);
  2. Создала метод для проверки контекста:
    public void checkTheWebview() { System.out.print(getDriver().getContextHandles()); }
  3. С найденым названием создала метод для перехода в режим работы вебвью:
    public void changeToWebview() {getDriver().context(“WEBVIEW_com”);}
  4. Все элементы, с которыми нужно работать переопределила как веб элементы:
    @FindBy(id = “userName”)
    public WebElement mail;

Можно с ними взаимодействовать! :slight_smile: Отдельная ошибка уже при взаимодействии c Cucumber - но это уже другое.
Надеюсь, кому-то такая инструкция поможет :smile:
Спасибо за помощь!