如何在 python 代码中将 SetText 用于名称包含空格的编辑框

How to use SetText for a edit box whose name has spaces in python code

我正在使用 pywinauto 自动化应用程序。我使用 PrintControlIdentifiers 打印对象名称和属性。很少有编辑框的名称中包含 space。这是一个例子:

| [u'Cr. PriceEdit1', u'Cr. PriceEdit0', u'Tr. PriceEdit']
   | child_window(class_name="Edit")

我不能使用 parentWindow.Cr. PriceEdit1.SetText("name1"),因为它会导致编译错误。如何在代码中使用此控件来执行 SetText?

注意:我知道使用 child_window(title="Cr. PriceEdit0", class_name="Edit") 但仍然想知道是否有一种方法可以直接将 SetText 与编辑框名称一起使用。

pywinauto 可以使用相邻控件对动态文本控件(如编辑框)进行静态命名。有5 rules here个可以申请。在您的情况下,它应该是规则 #4。

我想 "Cr. Price" 是编辑框内的文本,而 "Tr. Price" 是左侧的静态文本(标签)。当然最好到处使用静态文本,因为编辑框内容是不断变化的。

为避免属性名称不正确导致语法错误,您应该将不允许的符号替换为下划线,例如。或者您可以直接删除它们:

parentWindow.Cr__PriceEdit1.SetText("name1")
parentWindow.TrPriceEdit.SetText("name1")

这应该可行,因为 pywinauto 使用所谓的 "best match" 算法来进行属性访问。它计算每 2 个文本之间的距离并选择最接近的文本,或者如果所有文本都离目标文本太远则失败。

说这些语句做同样的事情:

parentWindow.child_window(best_match='Cr__PriceEdit1').SetText("name1")
parentWindow.child_window(best_match='TrPriceEdit').SetText("name1")

另一种方法 "best match" 是基于密钥的访问:

parentWindow[u'Tr. PriceEdit'].SetText('name1')
# is the same as
parentWindow.child_window(best_match=u'Tr. PriceEdit').SetText('name1')