Keresés

Új hozzászólás Aktív témák

  • SzVFE1

    csendes tag

    válasz sztanozs #3414 üzenetére

    Köszönöm, átfutottam, ígéretes, bár Python-tól függetlennek tűnik. Ez várhatóan ki is tudja olvasni a terminál ablakban lévő prompt-ot, command output-okat stb? A pyWinauto-val ott akadtam el ugyanis.

  • SzVFE1

    csendes tag

    válasz kovisoft #3412 üzenetére

    Rendben, köszi. Esetleg a pywinauto-n kívül más, ami hasonló célra való és érdemes vele próbálkozni?

  • SzVFE1

    csendes tag

    válasz kovisoft #3410 üzenetére

    Akkor szerinted ez a terminál vezérlés Python alatt semmilyen módszerrel nem kivitelezhető? Mindenesetre megcsináltam, amit javasoltál, a következő kóddal a következőt dobta ki. Nem tudom, hogy az 1000:1000 koordinátákkal eltaláltam-e a felületet, de nagyméretben az teszi ki a képernyő döntő részét.

    from pywinauto.application import Application
    app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
    textEditor = app.val.child_window(control_type="Tab").wrapper_object()
    getline = app.val.child_window(auto_id="67104", control_type="Edit").wrapper_object()
    top_wnd = app.top_window().wrapper_object()
    print (control)


    Eredmény:

    uiawrapper.UIAWrapper - '', Dialog

    Process finished with exit code 0

    Ezzel tudunk valamit kezdeni?

  • SzVFE1

    csendes tag

    válasz kovisoft #3407 üzenetére

    De természetesen megcsinálhatom a from_point lekérdezést is, ha azzal előrébb leszek és esetleg meg tudnád pontosabban adni, hogy hogyan kell.

  • SzVFE1

    csendes tag

    válasz kovisoft #3407 üzenetére

    Igen, ahogy mondod a type_keys van használva. Bevágom akkor alább a teljes fastruktúrát, hogy látni lehessen, hogy mennyire kevés a választék. Az alábbi kóddal simán megy a beleírás és a tab váltás is. A tab control alatti pane contol-okkal szintén. Nem ragaszkodom a pywinauto-hoz, bármilyen módszer tökéletes lenne, amivel parancsokat tudnék küldeni a MobaXterm adott tab-jába és szöveget tudnék kiolvasni belőle.

    from pywinauto.application import Application
    app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
    textEditor = app.val.child_window(control_type="Tab").wrapper_object()
    textEditor.type_keys("^{TAB 2}")
    textEditor.type_keys("test",with_spaces = True)

    Control Identifiers:

    Dialog - 'val' (L-11, T-11, R3851, B2111)
    ['Dialog', 'val', 'valDialog', 'val0', 'val1', 'Dialog0', 'Dialog1']
    child_window(title="val", control_type="Window")
    |
    | Pane - '' (L0, T131, R3840, B173)
    | ['Pane', 'Pane0', 'Pane1']
    | child_window(auto_id="67100", control_type="Pane")
    | |
    | | Pane - '' (L0, T131, R360, B173)
    | | ['Pane2']
    | | child_window(auto_id="67102", control_type="Pane")
    | | |
    | | | Edit - '' (L6, T143, R354, B167)
    | | | ['Edit']
    | | | child_window(auto_id="67104", control_type="Edit")
    | |
    | | Pane - '' (L364, T131, R3778, B173)
    | | ['Pane3']
    | | child_window(auto_id="67108", control_type="Pane")
    |
    | Pane - '' (L0, T2070, R3840, B2100)
    | ['Pane4']
    | child_window(auto_id="67098", control_type="Pane")
    |
    | Pane - '' (L0, T64, R3840, B131)
    | ['Pane5']
    | child_window(auto_id="67096", control_type="Pane")
    |
    | Pane - '' (L0, T173, R360, B2070)
    | ['Pane6']
    | child_window(auto_id="66876", control_type="Pane")
    | |
    | | Pane - '' (L0, T173, R360, B2070)
    | | ['Pane7']
    | | child_window(auto_id="66878", control_type="Pane")
    | | |
    | | | TabControl - '' (L0, T173, R360, B2070)
    | | | ['TabControl']
    | | | child_window(auto_id="132416", control_type="Tab")
    | | | |
    | | | | Pane - '' (L52, T177, R356, B2066)
    | | | | ['Pane8']
    | | | | child_window(auto_id="66884", control_type="Pane")
    | | | | |
    | | | | | Pane - '' (L52, T177, R356, B2066)
    | | | | | ['Pane9']
    | | | | | child_window(auto_id="66886", control_type="Pane")
    | | | | | |
    | | | | | | TreeView - '' (L52, T177, R356, B2066)
    | | | | | | ['TreeView']
    | | | | | | child_window(auto_id="132424", control_type="Tree")
    | | | | | | |
    | | | | | | | TreeItem - 'User sessions' (L96, T177, R195, B211)
    | | | | | | | ['User sessionsTreeItem', 'TreeItem', 'User sessions', 'TreeItem0', 'TreeItem1']
    | | | | | | | child_window(title="User sessions", control_type="TreeItem")
    | | | | | | |
    | | | | | | | TreeItem - 'val' (L122, T211, R146, B245)
    | | | | | | | ['val2', 'valTreeItem', 'TreeItem2']
    | | | | | | | child_window(title="val", control_type="TreeItem")
    | | | |
    | | | | TabItem - '' (L2, T175, R50, B229)
    | | | | ['TabItem', 'TabItem0', 'TabItem1']
    | | | |
    | | | | TabItem - '' (L2, T229, R50, B283)
    | | | | ['TabItem2']
    | | | |
    | | | | TabItem - '' (L2, T283, R50, B337)
    | | | | ['TabItem3']
    |
    | Pane - '' (L366, T173, R3840, B2070)
    | ['Pane10']
    | child_window(auto_id="67090", control_type="Pane")
    | |
    | | ListBox - '' (L306, T113, R307, B114)
    | | ['ListBox']
    | | child_window(auto_id="67094", control_type="List")
    | |
    | | Pane - '' (L366, T173, R3840, B2070)
    | | ['Pane11']
    | | child_window(auto_id="67092", control_type="Pane")
    | | |
    | | | Dialog - '' (L366, T173, R3840, B2070)
    | | | ['Dialog2']
    | | | |
    | | | | ScrollBar - 'Függőleges' (L3814, T173, R3840, B2070)
    | | | | ['Függőleges', 'ScrollBar', 'FüggőlegesScrollBar']
    | | | | child_window(title="Függőleges", auto_id="NonClientVerticalScrollBar", control_type="ScrollBar")
    | | | | |
    | | | | | Button - 'Egy sorral fel' (L3814, T173, R3840, B199)
    | | | | | ['Egy sorral felButton', 'Button', 'Egy sorral fel', 'Button0', 'Button1']
    | | | | | child_window(title="Egy sorral fel", auto_id="UpButton", control_type="Button")
    | | | | |
    | | | | | Button - 'Egy sorral le' (L3814, T2044, R3840, B2070)
    | | | | | ['Button2', 'Egy sorral leButton', 'Egy sorral le']
    | | | | | child_window(title="Egy sorral le", auto_id="DownButton", control_type="Button")
    |
    | TitleBar - '' (L24, T-8, R3840, B34)
    | ['TitleBar']
    | |
    | | Menu - 'Rendszer' (L0, T0, R22, B22)
    | | ['Rendszer', 'Menu', 'RendszerMenu', 'Rendszer0', 'Rendszer1', 'Menu0', 'Menu1']
    | | child_window(title="Rendszer", auto_id="MenuBar", control_type="MenuBar")
    | | |
    | | | MenuItem - 'Rendszer' (L0, T0, R22, B22)
    | | | ['RendszerMenuItem', 'MenuItem', 'Rendszer2', 'MenuItem0', 'MenuItem1']
    | | | child_window(title="Rendszer", control_type="MenuItem")
    | |
    | | Button - 'Kis méret' (L3627, T11, R3698, B33)
    | | ['Button3', 'Kis méret', 'Kis méretButton']
    | | child_window(title="Kis méret", control_type="Button")
    | |
    | | Button - 'Előző méret' (L3698, T11, R3768, B33)
    | | ['Előző méretButton', 'Button4', 'Előző méret']
    | | child_window(title="Előző méret", control_type="Button")
    | |
    | | Button - 'Bezárás' (L3768, T11, R3851, B33)
    | | ['BezárásButton', 'Button5', 'Bezárás']
    | | child_window(title="Bezárás", control_type="Button")
    |
    | Menu - 'Alkalmazás' (L0, T23, R2560, B42)
    | ['AlkalmazásMenu', 'Alkalmazás', 'Menu2']
    | child_window(title="Alkalmazás", auto_id="MenuBar", control_type="MenuBar")
    | |
    | | MenuItem - '' (L0, T23, R57, B42)
    | | ['MenuItem2']
    | |
    | | MenuItem - '' (L57, T23, R116, B42)
    | | ['MenuItem3']
    | |
    | | MenuItem - '' (L115, T23, R153, B42)
    | | ['MenuItem4']
    | |
    | | MenuItem - '' (L153, T23, R208, B42)
    | | ['MenuItem5']
    | |
    | | MenuItem - '' (L209, T23, R250, B42)
    | | ['MenuItem6']
    | |
    | | MenuItem - '' (L249, T23, R298, B42)
    | | ['MenuItem7']
    | |
    | | MenuItem - '' (L299, T23, R355, B42)
    | | ['MenuItem8']
    | |
    | | MenuItem - '' (L355, T23, R407, B42)
    | | ['MenuItem9']
    | |
    | | MenuItem - '' (L407, T23, R445, B42)
    | | ['MenuItem10']

  • SzVFE1

    csendes tag

    válasz kovisoft #3404 üzenetére

    Szöveget beleírni a Tab vagy Pane control kiválasztásával sikeresen tudok, csak a kiolvasás nem akar nekem menni. Edit control-ból 2 szokott lenni, az egyik ráadásul el is szokott tűnni a fa struktúrából valami miatt. Lefut a get_line rájuk hibaüzenet nélkül ha a 0-ás sort adom meg, de nem olvas ki semmit. A from_point-ot hogyan kéne esetemben használni? Nem veszélyes abból a szempontból, hogy a kódnak más gépeken, más felbontással is működnie kell? Arra gondolok, ha mondjuk pl. a felhasználó kisméretűben használja az ablakot a képernyő egy random részén, akkor máshova esnek a koordináták.

  • SzVFE1

    csendes tag

    válasz kovisoft #3402 üzenetére

    Igen, így most lefut exit code 0-val, tehát hibátlanul. Viszont nem ír ki sort, ha meg így adom be, akkor azt írja ki, hogy nem létezik első sor, tehát nem a terminálban keresi, mert ott több sor van.
    print(getline.get_line(1)

  • SzVFE1

    csendes tag

    válasz SzVFE1 #3400 üzenetére

    Most ki is próbáltam ebben a formában, de ezt is eldobja hibával. Egyébként bármilyen tanácsot szívesen fogadok, a pywinauto-hoz sem ragaszkodom, ha létezik jobb a MobaXterm kontrollálására.

    from pywinauto.application import Application
    app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
    app.val.print_control_identifiers()
    textEditor = app.val.child_window(control_type="Tab").wrapper_object()
    getline = app.val.child_window(auto_id="66952", control_type="Edit").wrapper_object()
    print(getline.Edit.get_line(0))

        print(getline.Edit.get_line(0))
    AttributeError: 'EditWrapper' object has no attribute 'Edit'

  • SzVFE1

    csendes tag

    válasz kovisoft #3399 üzenetére

    Köszönöm, csak ezzel is az lesz a baj, hogy control_type="Edit" -ből 2 létezik, ezért tovább kell szűkíteni auto_id alapján, ami legközelebbre megváltozik. Vagy létezik megoldás arra, hogy a kódon ne kelljen minden alkalommal változtatni?

  • SzVFE1

    csendes tag

    válasz kovisoft #3396 üzenetére

    Annyi a gáz, hogy így is alig találtam meg azt a child window-t, amivel kontrollálni tudom a MobaXterm-et. Végül kiderült, hogy ezek control_type="Tab" és control_type="Pane" tulajdonságokkal szerepelnek. Sajnos a control_type="Pane" -ek sem szűkítik le tab-ra, csak ablakra a célt, ezért elégnek találtam a control_type="Tab" -ot használni. Az ablakba írás működik is vele tökéletesen. A másik ok pedig az volt, hogy a control_type="Tab" -ból szerencsére egyetlen létezik, míg control_type="Pane" -ből több, ezért tovább kellene szűkíteni auto_id alapján, ami folyamatosan változik, egyszer használható, így ez lehetetlen küldetésnek tűnik. Bemásolom ide alább a fa struktúra vonatkozó részét, az alapján esetleg lenne ötlet, hogy hogyan változtassam?
    Még egy kérdés, a textEditor az egy objektum, nem egy tetszőleges névvel megadható változó?

       |    |    | child_window(auto_id="132416", control_type="Tab")
       |    |    |    | 
       |    |    |    | Pane - ''    (L52, T177, R356, B2066)
       |    |    |    | ['Pane8']
       |    |    |    | child_window(auto_id="197962", control_type="Pane")
       |    |    |    |    | 
       |    |    |    |    | Pane - ''    (L52, T2013, R356, B2066)
       |    |    |    |    | ['Pane9']
       |    |    |    |    | child_window(auto_id="67182", control_type="Pane")
       |    |    |    |    |    | 
       |    |    |    |    |    | CheckBox - ' Follow terminal folder'    (L78, T2013, R356, B2066)
       |    |    |    |    |    | ['CheckBox', ' Follow terminal folder', ' Follow terminal folderCheckBox']
       |    |    |    |    |    | child_window(title=" Follow terminal folder", auto_id="67184", control_type="CheckBox")
       |    |    |    |    | 
       |    |    |    |    | Pane - ''    (L52, T177, R356, B216)
       |    |    |    |    | ['Pane10']
       |    |    |    |    | child_window(auto_id="67180", control_type="Pane")
       |    |    |    |    | 
       |    |    |    |    | ListBox - ''    (L52, T249, R356, B1961)
       |    |    |    |    | ['ListBox', 'ListBox0', 'ListBox1']
       |    |    |    |    | child_window(auto_id="132696", control_type="List")
       |    |    |    |    |    | 
       |    |    |    |    |    | Header - 'Fejlécellenőrzés'    (L52, T249, R356, B274)
       |    |    |    |    |    | ['Fejlécellenőrzés', 'Header', 'FejlécellenőrzésHeader']
       |    |    |    |    |    | child_window(title="Fejlécellenőrzés", auto_id="Header", control_type="Header")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Name'    (L52, T249, R536, B274)
       |    |    |    |    |    |    | ['NameHeaderItem', 'HeaderItem', 'Name', 'HeaderItem0', 'HeaderItem1']
       |    |    |    |    |    |    | child_window(title="Name", auto_id="HeaderItem 0", control_type="HeaderItem")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Size (KB)'    (L0, T0, R0, B0)
       |    |    |    |    |    |    | ['HeaderItem2', 'Size (KB)', 'Size (KB)HeaderItem']
       |    |    |    |    |    |    | child_window(title="Size (KB)", auto_id="HeaderItem 1", control_type="HeaderItem")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Last modified'    (L0, T0, R0, B0)
       |    |    |    |    |    |    | ['HeaderItem3', 'Last modifiedHeaderItem', 'Last modified']
       |    |    |    |    |    |    | child_window(title="Last modified", auto_id="HeaderItem 2", control_type="HeaderItem")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Owner'    (L0, T0, R0, B0)
       |    |    |    |    |    |    | ['HeaderItem4', 'OwnerHeaderItem', 'Owner']
       |    |    |    |    |    |    | child_window(title="Owner", auto_id="HeaderItem 3", control_type="HeaderItem")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Group'    (L0, T0, R0, B0)
       |    |    |    |    |    |    | ['Group', 'HeaderItem5', 'GroupHeaderItem']
       |    |    |    |    |    |    | child_window(title="Group", auto_id="HeaderItem 4", control_type="HeaderItem")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | HeaderItem - 'Access'    (L0, T0, R0, B0)
       |    |    |    |    |    |    | ['AccessHeaderItem', 'HeaderItem6', 'Access']
       |    |    |    |    |    |    | child_window(title="Access", auto_id="HeaderItem 5", control_type="HeaderItem")
       |    |    |    |    |    | 
       |    |    |    |    |    | ScrollBar - 'Vízszintes'    (L52, T1935, R356, B1961)
       |    |    |    |    |    | ['Vízszintes', 'VízszintesScrollBar', 'ScrollBar', 'ScrollBar0', 'ScrollBar1']
       |    |    |    |    |    | child_window(title="Vízszintes", auto_id="NonClientHorizontalScrollBar", control_type="ScrollBar")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | Button - 'Egy oszloppal balra'    (L52, T1935, R78, B1961)
       |    |    |    |    |    |    | ['Egy oszloppal balra', 'Egy oszloppal balraButton', 'Button', 'Button0', 'Button1']
       |    |    |    |    |    |    | child_window(title="Egy oszloppal balra", auto_id="UpButton", control_type="Button")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | Thumb - 'Elhelyezés'    (L78, T1935, R126, B1961)
       |    |    |    |    |    |    | ['Thumb', 'Elhelyezés', 'ElhelyezésThumb']
       |    |    |    |    |    |    | child_window(title="Elhelyezés", auto_id="ScrollbarThumb", control_type="Thumb")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | Button - 'Egy oldallal jobbra'    (L126, T1935, R330, B1961)
       |    |    |    |    |    |    | ['Button2', 'Egy oldallal jobbra', 'Egy oldallal jobbraButton']
       |    |    |    |    |    |    | child_window(title="Egy oldallal jobbra", auto_id="DownPageButton", control_type="Button")
       |    |    |    |    |    |    | 
       |    |    |    |    |    |    | Button - 'Egy oszloppal jobbra'    (L330, T1935, R356, B1961)
       |    |    |    |    |    |    | ['Egy oszloppal jobbraButton', 'Egy oszloppal jobbra', 'Button3']
       |    |    |    |    |    |    | child_window(title="Egy oszloppal jobbra", auto_id="DownButton", control_type="Button")
       |    |    |    |    |    | 
       |    |    |    |    |    | ListItem - '..'    (L52, T274, R1649, B307)
       |    |    |    |    |    | ['ListItem', '..ListItem', '..']
       |    |    |    |    |    | child_window(title="..", control_type="ListItem")
       |    |    |    |    | 
       |    |    |    |    | Edit - ''    (L52, T216, R356, B249)
       |    |    |    |    | ['Edit2']
       |    |    |    |    | child_window(auto_id="66952", control_type="Edit")
       |    |    |    | 
       |    |    |    | TabItem - ''    (L2, T175, R50, B229)
       |    |    |    | ['TabItem', 'TabItem0', 'TabItem1']
       |    |    |    | 
       |    |    |    | TabItem - ''    (L2, T229, R50, B283)
       |    |    |    | ['TabItem2']
       |    |    |    | 
       |    |    |    | TabItem - ''    (L2, T283, R50, B337)
       |    |    |    | ['TabItem3']
       |    |    |    | 
       |    |    |    | TabItem - ''    (L2, T337, R50, B391)
       |    |    |    | ['TabItem4']

  • SzVFE1

    csendes tag

    Üdv, kezdőként lenne tanácsra szükségem, de gondolom a kérdésből ez fel fog tűnni. MobaXterm app-ban szeretnék műveleteket automatizálni és úgy olvastam, hogy erre a pyWinauto a legalkalmasabb. A MobaXterm -et arra használom, hogy egyszerre indítsak ssh command terminálokat különböző IP-k felé. Az egyes terminálok külön tab-okon jelennek meg a MobaXterm felületén. Azt már elértem, hogy parancsokat tudjak küldeni a terminálokba és váltogatni is tudok a terminálok között, ha CTRL+TAB-ot küldök az ablakba. Következő lépésként azt szeretném elérni, hogy a kód magától felismerje, hogy éppen melyik tab-ban dolgozik a terminálban lévő prompt alapján. Ott akadtam el, hogy kiolvasni sem tudom a prompt-ot, ezt get_line-al próbáltam. Az alábbi módon próbálkoztam:

    from pywinauto.application import Application
    app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
    textEditor = app.val.child_window(control_type="Tab").wrapper_object()
    print(textEditor.Edit.get_line(0))
    textEditor.type_keys("^{TAB 2}")
    textEditor.type_keys("test",with_spaces = True)


    De az alábbi hibaüzenetet kaptam:

       print(textEditor.Edit.get_line(0))
    AttributeError: 'TabControlWrapper' object has no attribute 'Edit'

    Tudna segíteni valaki, hogy mit rontottam el?

Új hozzászólás Aktív témák