Как найти элемент по имени класса и идентификатору доступности? - PullRequest
0 голосов
/ 11 февраля 2019

Я автоматизирую приложение Windows через сеанс рабочего стола, используя Appium и Windows Application Driver.Некоторые элементы, с которыми я хочу взаимодействовать, не имеют уникальных идентификаторов доступности, но комбинация их имен классов и идентификаторов действительно уникальна.Как я могу сначала получить список элементов по имени класса, а затем получить один из них с определенным идентификатором?

Я знаю, что вторая строка предоставленного кода неверна, я просто показываю этопродемонстрируйте, какое поведение мне нужно.

Ниже указано class имя:

class_elements = driver.find_elements_by_class_name("some_class_name")

Ниже указано accessibility id:

specific_element = class_elements.find_element_by_accessibility_id("some_id")
specific_element.click()

Есть лиспособ соединить оба этих элемента в один цикл?

Спасибо @Moshe Slavin за ваше предложение

Я попробовал следующий фрагмент кода

@pytest.mark.trial
def test_trial():
    className = "UIProperty"
    class_elements = ds.find_elements_by_class_name("UIProperty")

    for elm in class_elements:
        print(elm.get_attribute('id'))
        if elm.get_attribute('id') == "System.ItemNameDisplay":
            elm.click()

Я решилраспечатать идентификаторы также.Я получил следующие результаты:
Нет
Нет
Нет
... Я совершенно не понимаю, почему это происходит.Я использую инструмент Windows Inspect из SDK для сбора свойств элементов пользовательского интерфейса, и определенно есть и элемент, который соответствует как имени класса, так и идентификатору.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Ответ Моше Славина работает, но вы можете попробовать вот так же.

Предположим, у вас есть какое-то имя класса, и вы храните его в некоторой переменной, как показано ниже:

className = "some class name"

затем выможно получить все совпадающие имена классов, используя строку ниже, и вы знаете об этом:

 driver.find_elements_by_class_name(className)

Вместо того, чтобы находить все элементы и сохранять значения, сохраните идентификатор доступности, который вы хотите проверить, в некоторой переменнойкак показано ниже:

accessibilityID = "some accessibility id"

Затем вы можете искать элемент, который содержит как имя класса, так и идентификатор доступности (только для ознакомительной цели, поэтому используйте атрибут, связанный с приложением, который идентифицирует обязательное поле), используя приведенный ниже xpathбез выполнения каких-либо циклов:

element = driver.find_element_by_xpath("//*[@class='"+className+"' and @accesibilityID='"+accessibilityID +"']");

Я надеюсь, что это тоже работает ...

0 голосов
/ 12 февраля 2019

Поскольку элементы, с которыми вы хотите взаимодействовать, уникальны, используя комбинацию их classname и accessibility-id, так что вы можете создать Список нужных элементов, используя любую из Стратегий локатора и переберите его, вызвав нужное действие:

  • css_selector:

    elements = driver.find_elements_by_css_selector(".some_class_name[accessibility-id='some_accessibility_id']")
    
  • xpath:

    elements = driver.find_elements_by_xpath("//*[@class='some_class_name' and @accessibility-id='some_accessibility_id']")
    

Ссылка: Appium - Поиск элементов Поиск нескольких элементов

0 голосов
/ 11 февраля 2019

Это должно выглядеть примерно так:

class_elements = driver.find_elements_by_class_name("some_class_name")

for elm in class_elements:
    if elm.get_attribute('accesibilityID') == "some_id":
        elm.click()

РЕДАКТИРОВАТЬ:

Как @ Билл Хайлман указал атрибут, который ищет OPaccesibilityID.

Спасибо, Билл

Надеюсь, это поможет вам!

...