Select 使用 pywinauto 的组合框中的项目
Select an item from a combobox using pywinauto
我正在尝试使用 pywinauto 自动化 Visual Basic 应用程序,后端 ="win32"。除了从其中一个组合框中选择一个项目外,我能够处理所有事情。这个特定的组合框取决于另一个组合框的选择
代码如下:
app.ThunderRT6MDIForm.xxxxx.ComboBox3.select("abc") # this correctly selects from the combobox
app.ThunderRT6MDIForm.xxxxx.ComboBox4.select(1) #This one gives error
同样的错误:
IndexError: Combobox has 0 items, you requested item 1 (0 based)
控制标识符return:
ComboBox - 'abc' (L136, T206, R376, B227)
| ['ComboBox3', 'abc co-brandingComboBox2']
| child_window(title="abc", class_name="ThunderRT6ComboBox")
|
| | Edit - '' (L139, T234, R356, B249)
| | ['abc co-brandingEdit10', 'Edit12']
| | child_window(class_name="Edit")
ComboBox - '' (L136, T157, R376, B178)
| ['4', 'ComboBox4']
| child_window(class_name="ThunderRT6ComboBox")
| |
| | Edit - '' (L139, T160, R356, B175)
| | ['5', 'Edit14']
| | child_window(class_name="Edit")
我找到了解决此问题的临时解决方法。我发现按 Alt + 向下键可以打开组合框并给了我列表。所以,我在代码中也使用了相同的逻辑并且它起作用了!
app.ThunderRT6MDIForm.xxxxx.ComboBox4.Edit14.type_keys("%{DOWN}")
app.ThunderRT6MDIForm.xxxxx.ComboBox4.select("item")
试试这个方法:(不要忘记传递 combo_box 元素)
def set_combo_box_item_that_starts_with(combo_box, searched_string):
for text in combo_box.GetProperties()['texts']:
if text.startswith(searched_string):
combo_box.select(searched_string)
return None
又一个变体:
loginWindow["Edit1"].type_keys("%{DOWN}")
loginWindow.child_window(title="choiceYouWant", control_type="ListItem").click_input()
之前的答案对我不起作用。
下面是我的实现方式。
def comboselect(combo,sel):
combo.type_keys("{ENTER}") # Selects the combo box
texts = combo.texts() #gets all texts available in combo box
try:
index = texts.index(str(sel)) #find index of required selection
except ValueError:
return False
sel_index = combo.selected_index() # find current index of combo
if(index>sel_index):
combo.type_keys("{DOWN}"*abs(index-sel_index))
else:
combo.type_keys("{UP}"*abs(index-sel_index))
return True
我正在尝试使用 pywinauto 自动化 Visual Basic 应用程序,后端 ="win32"。除了从其中一个组合框中选择一个项目外,我能够处理所有事情。这个特定的组合框取决于另一个组合框的选择
代码如下:
app.ThunderRT6MDIForm.xxxxx.ComboBox3.select("abc") # this correctly selects from the combobox
app.ThunderRT6MDIForm.xxxxx.ComboBox4.select(1) #This one gives error
同样的错误:
IndexError: Combobox has 0 items, you requested item 1 (0 based)
控制标识符return:
ComboBox - 'abc' (L136, T206, R376, B227)
| ['ComboBox3', 'abc co-brandingComboBox2']
| child_window(title="abc", class_name="ThunderRT6ComboBox")
|
| | Edit - '' (L139, T234, R356, B249)
| | ['abc co-brandingEdit10', 'Edit12']
| | child_window(class_name="Edit")
ComboBox - '' (L136, T157, R376, B178)
| ['4', 'ComboBox4']
| child_window(class_name="ThunderRT6ComboBox")
| |
| | Edit - '' (L139, T160, R356, B175)
| | ['5', 'Edit14']
| | child_window(class_name="Edit")
我找到了解决此问题的临时解决方法。我发现按 Alt + 向下键可以打开组合框并给了我列表。所以,我在代码中也使用了相同的逻辑并且它起作用了!
app.ThunderRT6MDIForm.xxxxx.ComboBox4.Edit14.type_keys("%{DOWN}")
app.ThunderRT6MDIForm.xxxxx.ComboBox4.select("item")
试试这个方法:(不要忘记传递 combo_box 元素)
def set_combo_box_item_that_starts_with(combo_box, searched_string):
for text in combo_box.GetProperties()['texts']:
if text.startswith(searched_string):
combo_box.select(searched_string)
return None
又一个变体:
loginWindow["Edit1"].type_keys("%{DOWN}")
loginWindow.child_window(title="choiceYouWant", control_type="ListItem").click_input()
之前的答案对我不起作用。
下面是我的实现方式。
def comboselect(combo,sel):
combo.type_keys("{ENTER}") # Selects the combo box
texts = combo.texts() #gets all texts available in combo box
try:
index = texts.index(str(sel)) #find index of required selection
except ValueError:
return False
sel_index = combo.selected_index() # find current index of combo
if(index>sel_index):
combo.type_keys("{DOWN}"*abs(index-sel_index))
else:
combo.type_keys("{UP}"*abs(index-sel_index))
return True