如何通过类名和可访问性ID定位元素?

时间:2019-02-11 13:42:33

标签: selenium webdriver appium winappdriver

我正在使用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都匹配。

3 个答案:

答案 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)

由于您要交互的元素是结合使用classnameaccessibility-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']")
    
  

参考:Locator Strategies