Как найти элемент по имени класса и идентификатору доступности?

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

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

Ниже до конца class название:

class_elements = driver.find_elements_by_class_name("some_class_name")

Ниже через accessibility Я бы:

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

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

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

Я попробовал следующий кусок кода

@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 ответа

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

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()

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

Как Bill Hileman, атрибут, который искал OP, это accesibilityID не просто id,

Спасибо Билл

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

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

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

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 +"']");

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

Поскольку элементы, которые вы хотите взаимодействовать, уникальны, используя комбинацию их 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 - Поиск элементов Поиск нескольких элементов

Другие вопросы по тегам