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