我正在使用Appium和Windows应用程序驱动程序通过桌面会话自动执行Windows应用程序。我要与之交互的某些元素没有唯一的可访问性ID,但是它们的类名和ID的组合确实是唯一的。 如何首先按类名称获取元素列表,然后使用特定ID提取其中一个?
我知道所提供的第二行代码不正确,我只是在演示它以证明我需要什么行为。
下面是通过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()
我决定也打印ID。我得到以下结果:
无
无
无
...
我很困惑为什么会这样。我正在使用SDK中的Windows Inspect工具来收集UI元素的属性,并且肯定存在和元素,它们与类名和ID都匹配。
答案 0 :(得分: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
。
谢谢比尔
希望这对您有帮助!
答案 1 :(得分:2)
Moshe Slavin的答案有效,但是您也可以这样尝试。
假设您有一些类名,并且将其存储在如下所示的变量中:
className = "some class name"
然后,您可以使用下面的行获取所有匹配的类名称,并且您知道这一点:
driver.find_elements_by_class_name(className)
而不是查找所有元素并存储值,而是将要检查的可访问性ID存储在以下变量中:
accessibilityID = "some accessibility id"
然后,您可以使用以下xpath搜索同时包含类名称和可访问性ID的元素(仅出于指示性目的,因此请使用与应用相关的属性,它标识必填字段),无需执行任何循环:
element = driver.find_element_by_xpath("//*[@class='"+className+"' and @accesibilityID='"+accessibilityID +"']");
我希望它也可以...
答案 2 :(得分:-1)
由于您要交互的元素是结合使用classname
和accessibility-id
的唯一元素,因此您可以使用{ {3}}并对其进行迭代以调用所需的操作:
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']")