Как найти элемент по имени класса и идентификатору доступности?
Я автоматизирую приложение 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']")