我正在使用带有 Python 的 Winium 来自动化桌面应用程序,并且遇到了我在自动化方面遇到问题的 GUI 的一部分。
在创建配置的过程中,用户将有一个窗口,他们可以在其中选择要创建的协议类型。
我遇到的问题是通过鼠标单击选择表中的特定行。由于有多行具有相同的协议名称,我将要根据协议名称和模式(即 Modbus 从站)选择一行。
理想情况下,我想搜索表格,根据协议和模式找到所需的行,然后选择该行。我已经弄清楚如何仅使用协议名称来选择一行:
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_element_by_id("LargeIncrement").click()
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_element_by_name("Modbus").click()
我遇到的问题是找到一种基于两个参数选择行的方法。对于 Web UI 测试,它通常是一个“/td”或“/tr”对象,我可以很容易地在 HTML 代码中找到列表/表格,并使用它的 XPath 来指定一行或一行中的一个单元格。我的桌面应用程序并非如此。我一直在尝试同时使用Inspect Object (Ver 7.2.0.0) ...
...和UISpy(版本 3.0.0.0)...
...但一直无法弄清楚如何执行此操作。通过一些研究和搜索,我尝试了以下几种组合:
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_elements(By.NAME)
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_elements(By.ID, "item")
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1")[5]
我做了一些元素挖掘并且能够显示有 182 个 Xpath 对象。
protocol_table = driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1")
all_xpath_children = protocol_table.find_elements_by_xpath(".//*")
print "Length:" + str(len(all_xpath_children))
我确信有办法实现这一点,但我正在努力解决这个问题。我发现的文档非常少,而且我发现的大部分帮助都是针对 Java 的。
更新 (1) 4/24/2019 我也一直在分别查看列表中的项目,希望找到一种方法来执行此操作。以下是列表/表格中这些项目之一的信息:
更新 (2) 2019 年 4 月 24 日 我发现了一些有用的东西。我在上面的 Inspect 和 UISpy 屏幕截图中注意到,当单击表中存在的单个项目时,它显示“LocalizedControlType”等于“文本”。因此,我开始使用该参数测试不同的可能性,并使用上面的 XPath 取得成功。我发现以下所有 3 个选项都能够选择表中的 Modbus Slave 行:
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_element_by_xpath("(//*[@LocalizedControlType='text'])[79]").click()
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_element_by_xpath("(//*[@LocalizedControlType='text'])[80]").click()
driver.find_element_by_class_name("WindowsForms10.SysListView32.app.0.141b42a_r9_ad1").find_element_by_xpath("(//*[@LocalizedControlType='text'])[81]").click()
选择对象 78 会导致选择 Modbus 主站,选择对象 82 会导致选择下一行。这种方法会起作用,但如果能找到一种更简洁的方法来选择既知道“协议”又知道“模式”的行会很好。