Поиск элемента по id

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 007
Благодарностей
538
Баллы
113
Доброго времени суток, ситуация такая

получаю объект типа IAndroidElementAPI (для клика по нему), элемент находится какой надо.

C#:
IAndroidElementAPI element = instance.DroidInstance.AppiumDriver.FindElementsByClassName("android.view.View");
затем у этого элемента получаю свойство id

C#:
string id = element.Id;
И тут же пытаюсь найти этот же элемент по id который только что у него же и получил

C#:
element = instance.DroidInstance.AppiumDriver.FindElementById(id);
В итоге он ничего не находит и element становится равен null.

Вопрос, как так?

Или может кто подсказать способ с помощью которого я смогу обновить данные эелемента? Просто я хочу до него сделать свайп и ориентируюсь на его координату Y, после свайпа вниз мне надо элемент обновить что бы узнать новые значения координаты Y
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
378
Благодарностей
269
Баллы
63
И тут же пытаюсь найти этот же элемент по id который только что у него же и получил
Id в appium это уникальный идентификатор элемента (GUID, например, 00000000-0000-000a-ffff-ffff00000072)
А функция FindElementById(id) в appium ищет элемент по атрибуту resource-id.
Поэтому ничего не находит.

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

Сначала находим конкретный элемент и сохраняем его id в переменную
C#:
IAndroidElementAPI element = instance.DroidInstance.AppiumDriver.FindElementByClassName("android.widget.LinearLayout");

if (element == null)
    throw new Exception("not found");

project.Variables["id"].Value = element.Id;

return element.GetAttribute("bounds");
Делаем свайп.

И снова ищем, но не конкретный элемент, а массив элементов того же класса. И в найденном массиве выбираем элемент с сохраненным ID

C#:
IAndroidElementAPI [] elements = instance.DroidInstance.AppiumDriver.FindElementsByClassName("android.widget.LinearLayout");

var id = project.Variables["id"].Value;
var element = elements.FirstOrDefault(e => e.Id == id);

if (element == null)
    throw new Exception("not found");

return element.GetAttribute("bounds");
Смотрите внимательно, первый раз искали один элемент FindElementByClassName, второй раз массив FindElementsByClassName.
 
  • Спасибо
Реакции: Sherminator

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 007
Благодарностей
538
Баллы
113
Id в appium это уникальный идентификатор элемента (GUID, например, 00000000-0000-000a-ffff-ffff00000072)
А функция FindElementById(id) в appium ищет элемент по атрибуту resource-id.
Поэтому ничего не находит.

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

Сначала находим конкретный элемент и сохраняем его id в переменную
C#:
IAndroidElementAPI element = instance.DroidInstance.AppiumDriver.FindElementByClassName("android.widget.LinearLayout");

if (element == null)
    throw new Exception("not found");

project.Variables["id"].Value = element.Id;

return element.GetAttribute("bounds");
Делаем свайп.

И снова ищем, но не конкретный элемент, а массив элементов того же класса. И в найденном массиве выбираем элемент с сохраненным ID

C#:
IAndroidElementAPI [] elements = instance.DroidInstance.AppiumDriver.FindElementsByClassName("android.widget.LinearLayout");

var id = project.Variables["id"].Value;
var element = elements.FirstOrDefault(e => e.Id == id);

if (element == null)
    throw new Exception("not found");

return element.GetAttribute("bounds");
Смотрите внимательно, первый раз искали один элемент FindElementByClassName, второй раз массив FindElementsByClassName.
Спасибо большое за разъяснения, привет кодеру который додумался поиск по resource-id назвать поиском по id
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
378
Благодарностей
269
Баллы
63
Спасибо большое за разъяснения, привет кодеру который додумался поиск по resource-id назвать поиском по id
Это исторические названия функций, в api ZennoDroid перекочевали без изменений, во избежание путаницы.
Тоже поначалу вызывало некоторое недоумение. Например, поиск по AccessibilityID в Android это поиск по content-desc, т.е. по текстовому содержимому элемента.
 
  • Спасибо
Реакции: Sherminator

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 007
Благодарностей
538
Баллы
113
Например, поиск по AccessibilityID в Android это поиск по content-desc, т.е. по текстовому содержимому элемента.
Вот это я щас конкретно ахренел, а он ищет по content-desc и по text или только по content-desc ?
Просто бывает что элемент называется на пример "Кнопка" и если делать поиск по атрибуту, то иногда атрибут называется content-desc а иногда text
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
378
Благодарностей
269
Баллы
63
  • Спасибо
Реакции: Sherminator

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)