Python + pywinauto ۾ ڊيسڪ ٽاپ GUI کي خودڪار ڪرڻ: MS UI آٽوميشن سان دوستي ڪيئن ڪجي

Python لائبريري pywinauto ونڊوز تي ڊيسڪ ٽاپ GUI ايپليڪيشنن کي خودڪار ڪرڻ لاءِ هڪ اوپن سورس پروجيڪٽ آهي. گذريل ٻن سالن کان، ان ۾ نوان اهم خاصيتون ظاهر ٿيا آهن:

  • MS UI آٽوميشن ٽيڪنالاجي لاءِ سپورٽ. انٽرفيس ساڳيو آهي، ۽ هاڻي اهو سپورٽ ڪري ٿو: WinForms، WPF، Qt5، ونڊوز اسٽور (UWP) وغيره - تقريبن هر شي جيڪا ونڊوز تي آهي.
  • پس منظر / پلگ ان جو نظام (في الحال انهن مان ٻه آهن هود هيٺ: ڊفالٽ "win32" ۽ نئون "uia"). ان کان پوء اسان آسانيء سان ڪراس پليٽ فارم ڏانهن وڃو.
  • مائوس ۽ ڪيبورڊ لاءِ Win32 ٿلهو (پي هِڪ جي روح ۾ گرم چاٻيون).

اسان ان جو هڪ مختصر جائزو پڻ ڏينداسين جيڪو ڊيسڪ ٽاپ آٽوميشن لاءِ اوپن سورس ۾ موجود آهي (بغير سنگين مقابلي جي بناوٽ جي).

هي مضمون منسک ۾ SQA ڏينهن 20 ڪانفرنس جي هڪ رپورٽ جو هڪ جزوي نقل آهي (وڊيو ٽيپ и سلائيڊ)، جزوي طور روسي نسخو شروعاتي ھدايت وارو pywinauto لاء.

اچو ته هن علائقي ۾ اوپن سورس جي مختصر جائزو سان شروع ڪريون. ڊيسڪ ٽاپ GUI ايپليڪيشنن لاءِ، هر شي ويب جي ڀيٽ ۾ ڪجهه وڌيڪ پيچيده آهي، جنهن ۾ Selenium آهي. هتي مکيه طريقا آهن:

همراه جو طريقو

ڪلڪ پوائنٽن کي هارڊ ڪوڊ ڪريو، اسان ڪامياب هٽ جي اميد رکون ٿا.
[+] ڪراس پليٽ فارم، لاڳو ڪرڻ آسان.
[+] اهو آسان آهي "ريڪارڊ-ريپلي" ٽيسٽ رڪارڊنگ.
[-] اسڪرين ريزوليوشن، موضوع، فونٽ، ونڊو سائيز، وغيره کي تبديل ڪرڻ لاء سڀ کان وڌيڪ غير مستحڪم.
[-] وڏي مدد جي ڪوششن جي ضرورت آهي؛ اهو اڪثر آسان آهي ٽيسٽ کي شروع کان ٻيهر پيدا ڪرڻ يا دستي طور تي ٽيسٽ.
[-] صرف ڪارناما خودڪار ڪري ٿو؛ ڊيٽا جي تصديق ۽ ٻيهر حاصل ڪرڻ لاء ٻيا طريقا آهن.

اوزار (ڪراس پليٽ فارم): خودڪشي, PyAutoGUI, PyUserInput ۽ ٻيا ڪيترائي. عام طور تي، وڌيڪ پيچيده اوزار شامل آهن هن ڪارڪردگي (نه هميشه ڪراس پليٽ فارم).

اهو چوڻ جي قابل آهي ته ڪوآرڊينيٽ طريقو ٻين طريقن کي پورو ڪري سگهي ٿو. مثال طور، ڪسٽم گرافڪس لاءِ، توھان ڪلڪ ڪري سگھوٿا تعلقي ڪوآرڊينيٽس تي (ونڊو/عنصر جي مٿئين کاٻي ڪنڊ کان، ۽ پوري اسڪرين کان نه) - اھو عام طور تي ڪافي قابل اعتماد آھي، خاص طور تي جيڪڏھن توھان حساب ۾ رکو ٿا ڊگھائي/چوٽي کي. سڄو عنصر (پوء مختلف اسڪرين قراردادن کي نقصان نه ٿيندو).

ٻيو اختيار: صرف هڪ مشين مختص ڪريو مستحڪم سيٽنگن سان ٽيسٽ لاءِ (نه ڪراس پليٽ فارم، پر ڪجهه حالتن ۾ اهو سٺو آهي).

حوالو تصوير جي سڃاڻپ

[+] ڪراس پليٽ فارم
[+-] نسبتا قابل اعتماد (بهتر آهي همراه ڪرڻ واري طريقي کان)، پر اڃا تائين ڪجهه چالن جي ضرورت آهي.
[-+] نسبتا سست، ڇاڪاڻ ته ضرورت آهي CPU وسيلن جي سڃاڻپ جي الگورتھم لاءِ.
[-] ٽيڪسٽ جي سڃاڻپ (OCR)، ضابطي جي طور تي، سوال کان ٻاهر آهي => ٽيڪسٽ ڊيٽا حاصل نه ٿي ڪري سگھجي. جيتري قدر مون کي خبر آهي، موجوده او سي آر حل هن قسم جي ڪم لاءِ تمام گهڻا قابل اعتماد نه آهن، ۽ وڏي پيماني تي استعمال نه ڪيا ويا آهن (تبصرن ۾ ڀليڪار جيڪڏهن اهو اڳ ۾ ئي نه آهي).

اوزار: سکولي, لاکي (Sikuli-مطابقت رکندڙ، خالص پٿون) PyAutoGUI.

رسائي ٽيڪنالاجي

[+] سڀ کان وڌيڪ قابل اعتماد طريقو، ڇاڪاڻ ته توهان کي متن ذريعي ڳولڻ جي اجازت ڏئي ٿي، قطع نظر ته اهو سسٽم يا فريم ورڪ طرفان ڪيئن پيش ڪيو ويو آهي.
[+] توهان کي ٽيڪسٽ ڊيٽا ڪڍڻ جي اجازت ڏئي ٿي => ٽيسٽ جي نتيجن جي تصديق ڪرڻ آسان.
[+] ضابطي جي طور تي، تيز ترين، ڇاڪاڻ ته لڳ ڀڳ ڪو سي پي يو وسيلا استعمال نه ڪندو آهي.
[-] هڪ ڪراس پليٽ فارم ٽول ٺاهڻ ڏکيو آهي: بلڪل تمام اوپن سورس لائبريريون هڪ يا ٻه رسائي واري ٽيڪنالاجي جي حمايت ڪن ٿيون. Windows/Linux/MacOS مڪمل طور تي سپورٽ نه ڪئي وئي آهي سواءِ ادا ڪيلن کان سواءِ TestComplete، UFT يا Squish.
[-] اهڙي ٽيڪنالاجي هميشه اصولن ۾ دستياب ناهي. مثال طور، VirtualBox جي اندر لوڊنگ اسڪرين کي جانچڻ - اهو تصوير جي سڃاڻپ کان سواء نٿو ٿي سگهي. پر ڪيترن ئي کلاسک ڪيسن ۾، رسائي جو طريقو اڃا تائين لاڳو ٿئي ٿو. هن وڌيڪ بحث ڪيو ويندو.

اوزار: TestStack.White سي # ۾، Winium.Desktop C# ۾ (سيلينيم سان مطابقت)، MS WinApp ڊرائيور C# ۾ (Appium مطابقت رکندڙ) pywinauto, pyatom (LDTP هم آهنگ) Python-UIAutomation-لاء-ونڊوز, خودمختاري روبي ۾، ايل ڊي ٽي پي (لينڪس ڊيسڪ ٽاپ ٽيسٽنگ پروجيڪٽ) ۽ ان جو ونڊوز ورزن کوبرا.

LDTP شايد واحد ڪراس پليٽ فارم اوپن سورس ٽول آهي (وڌيڪ واضح طور تي، لائبريرين جو هڪ خاندان) رسائي ٽيڪنالاجي جي بنياد تي. بهرحال، اهو تمام گهڻو مشهور ناهي. مون ان کي پاڻ استعمال نه ڪيو آهي، پر تبصرن جي مطابق، ان جو انٽرفيس تمام آسان ناهي. جيڪڏهن توهان وٽ مثبت موٽ آهي، مهرباني ڪري ان کي تبصرن ۾ حصيداري ڪريو.

ٽيسٽ پٺئين دروازي (اڪا انڊور سائيڪل)

ڪراس-پليٽ فارم ايپليڪيشنن لاء، ڊولپر پاڻ اڪثر ڪري هڪ اندروني ميکانيزم ٺاهي رهيا آهن ته جيئن ٽيسٽ جي صلاحيت کي يقيني بڻائي سگهجي. مثال طور، اهي ايپليڪيشن ۾ هڪ خدمت TCP سرور ٺاهيندا آهن، ٽيسٽ ان سان ڳنڍيندا آهن ۽ ٽيڪسٽ حڪم موڪليندا آهن: ڇا تي ڪلڪ ڪيو، ڪٿي ڊيٽا حاصل ڪرڻ، وغيره. قابل اعتماد، پر آفاقي نه.

بنيادي ڊيسڪ ٽاپ رسائي ٽيڪنالاجيون

سٺو پراڻو Win32 API

گهڻيون ونڊوز ايپليڪيشنون WPF جي رليز ٿيڻ کان اڳ لکيون ويون ۽ پوءِ ونڊوز اسٽور Win32 API تي هڪ يا ٻئي طريقي سان ٺهيل هيون. يعني، MFC، WTL، C++ Builder، Delphi، VB6 - اهي سڀئي اوزار Win32 API استعمال ڪن ٿا. جيتوڻيڪ ونڊوز فارم گهڻو ڪري Win32 API سان مطابقت رکن ٿا.

اوزار: ڇت تي (VB سان ملندڙ جلندڙ) ۽ پٿون ريپر پائوٽوٽ, پاڻ هلنڏڙ (پنهنجي ٻولي، اتي هڪ IDispatch COM انٽرفيس آهي) pywinauto (پٿون) خودمختاري (روبي) win32-autogui (روبي).

Microsoft UI آٽوميشن

مکيه فائدو: MS UI آٽوميشن ٽيڪنالاجي Windows تي GUI ايپليڪيشنن جي وڏي اڪثريت کي ناياب استثنا سان سپورٽ ڪري ٿي. مسئلو: Win32 API کان وڌيڪ سکڻ آسان ناهي. ٻي صورت ۾، ڪو به ان جي مٿان چادر نه ٺاهي.

حقيقت ۾، هي ڪسٽم COM انٽرفيس جو هڪ سيٽ آهي (بنيادي طور تي UIAutomationCore.dll)، ۽ فارم ۾ هڪ .NET ريپر پڻ آهي namespace System.Windows.Automation. رستي جي ذريعي، اهو هڪ متعارف ٿيل بگ آهي جنهن جي ڪري ڪجهه UI عناصر ياد ٿي سگهن ٿيون. تنهن ڪري، اهو بهتر آهي ته UIAutomationCore.dll سڌو سنئون استعمال ڪريو (جيڪڏهن توهان C# ۾ UiaComWrapper بابت ٻڌو آهي، ته اهو آهي).

COM انٽرفيس جا قسم:

(1) بنيادي IUknown - "سڀ برائي جي جڙ". گھٽ ۾ گھٽ سطح، ڪڏهن به صارف دوست نه.
(2) IDspatch ۽ derivatives (مثال طور Excel.Application)، جيڪو پٿون ۾ استعمال ڪري سگھجي ٿو win32com.client پيڪيج استعمال ڪندي (pyWin32 سان گڏ). سڀ کان وڌيڪ آسان ۽ خوبصورت اختيار.
(3) ڪسٽم انٽرفيس جيڪي ٽئين پارٽي پٿون پيڪيج سان ڪم ڪري سگھن ٿا comtypes.

اوزار: TestStack.White سي # ۾، pywinauto 0.6.0+، Winium.Desktop سي # ۾، Python-UIAutomation-لاء-ونڊوز (UIAutomationCore.dll تي سي ريپرز لاءِ سندن سورس ڪوڊ ظاهر نه ڪيو ويو آهي) خودمختاري روبي ۾.

AT-SPI

ان حقيقت جي باوجود ته لينڪس فيملي جا لڳ ڀڳ سڀئي محور ايڪس ونڊو سسٽم تي ٺهيل آهن (فيڊورا 25 ۾، "X's" کي Wayland ۾ تبديل ڪيو ويو آهي)، "X's" توهان کي صرف مٿين سطح جي ونڊوز ۽ مائوس کي هلائڻ جي اجازت ڏئي ٿو. ڪي بورڊ. بٽن، لسٽ باڪس، وغيره جي تفصيلي تجزيي لاءِ، اتي AT-SPI ٽيڪنالاجي آهي. سڀ کان وڌيڪ مشهور ونڊو مينيجرز وٽ هڪ نام نهاد AT-SPI رجسٽري ڊيمون آهي، جيڪو ايپليڪيشنن لاء هڪ خودڪار GUI مهيا ڪري ٿو (گهٽ ۾ گهٽ Qt ۽ GTK سپورٽ آهن).

اوزار: pyatspi2.

pyatspi2، منهنجي خيال ۾، ڪيترن ئي انحصار تي مشتمل آهي جهڙوڪ PyGObject. ٽيڪنالاجي پاڻ هڪ باقاعده متحرڪ لائبريري جي طور تي دستياب آهي libatspi.so. هتي هڪ آهي حوالو دستي. pywinauto لائبريري لاءِ اسان AT-SPI سپورٽ کي هن طريقي سان لاڳو ڪرڻ جو منصوبو ڪريون ٿا: libatspi.so ۽ ctypes ماڊل لوڊ ڪندي. ھڪڙو ننڍڙو مسئلو آھي صرف گھربل ورجن استعمال ڪرڻ ۾، ڇو ته GTK + ۽ Qt ايپليڪيشنن لاءِ اھي ڪجھ مختلف آھن. مڪمل لينڪس سپورٽ سان pywinauto 0.7.0 جي امڪاني رليز 2018 جي ​​پهرين اڌ ۾ توقع ڪري سگهجي ٿي.

Apple Accessibility API

MacOS جي پنهنجي خودڪار ٻولي آهي، AppleScript. Python ۾ اهڙي شيء کي لاڳو ڪرڻ لاء، يقينا، توهان کي استعمال ڪرڻ جي ضرورت آهي ObjectiveC مان افعال. شروع ڪندي، اهو لڳي ٿو، MacOS 10.6 سان، pyobjc پيڪيج اڳ ۾ نصب ٿيل پٿون ۾ شامل آهي. اهو پڻ pywinauto ۾ مستقبل جي مدد لاءِ انحصار کي لسٽ ڪرڻ آسان بڻائيندو.

اوزار: ايپل اسڪرپٽ ٻولي کان علاوه، اهو ڌيان ڏيڻ جي قابل آهي ATOMac، aka pyatom. اهو LDTP سان مطابقت رکندڙ انٽرفيس آهي، پر هڪ اسٽينڊل لائبريري پڻ آهي. اهو آهي macOs تي iTunes آٽوميشن جو مثال، منهنجي شاگرد طرفان لکيل آهي. اتي ھڪڙو ڄاتل مسئلو آھي: لچڪدار وقت ڪم نه ڪندا آھن (طريقو waitFor*). پر مجموعي طور تي، خراب شيء ناهي.

ڪيئن شروع ڪجي pywinauto سان

پهريون قدم پنهنجو پاڻ کي هڪ GUI اعتراض انسپيڪٽر سان هٿ ڪرڻ آهي (جيڪو جاسوسي اوزار سڏيو ويندو آهي). اهو توهان جي اندر اندر ايپليڪيشن جو مطالعو ڪرڻ ۾ مدد ڪندو: عناصر جي درجه بندي ڪيئن ٺهيل آهي، ڪهڙا خاصيتون موجود آهن. سڀ کان وڌيڪ مشهور سائيٽ انسپيڪٽرز:

  • جاسوس ++ - بصري اسٽوڊيو سان شامل، بشمول ايڪسپريس يا ڪميونٽي ايڊيشن. Win32 API استعمال ڪري ٿو. سندس ڪلون به مشهور آهي AutoIt ونڊو ڄاڻ.
  • Inspect.exe - ونڊوز SDK ۾ شامل. جيڪڏهن توهان ان کي انسٽال ڪيو آهي، پوء 64-bit ونڊوز تي توهان ان کي فولڊر ۾ ڳولي سگهو ٿا C:Program Files (x86)Windows Kits<winver>binx64. انسپيڪٽر پاڻ ۾ توهان کي هڪ موڊ چونڊڻ جي ضرورت آهي UI آٽوميشن بدران MS AA (فعال رسائي، UI آٽوميشن جو اڳوڻو).

ايپليڪيشن جي ذريعي ۽ ذريعي جانچڻ کان پوء، اسان اهو پس منظر چونڊيو جيڪو اسان استعمال ڪنداسين. اهو ڪافي آهي پس منظر جو نالو بيان ڪرڻ لاءِ جڏهن ايپليڪيشن اعتراض ٺاهيو.

  • پس منظر = "win32" - جڏهن ڊفالٽ طور استعمال ڪيو ويو، MFC، WTL، VB6 ۽ ٻين ورثي واري ايپليڪيشنن سان سٺو ڪم ڪري ٿو.
  • پس منظر = "uia" - MS UI آٽوميشن لاءِ نئون پس منظر: WPF ۽ WinForms سان مڪمل طور تي ڪم ڪري ٿو. ڊيلفي ۽ ونڊوز اسٽور ايپليڪيشنن لاءِ پڻ سٺو؛ Qt5 ۽ ڪجھ جاوا ايپليڪيشنن سان ڪم ڪري ٿو. ۽ عام طور تي، جيڪڏهن Inspect.exe عناصر ۽ انهن جي ملڪيت کي ڏسي، پوء هي پس منظر مناسب آهي. اصولي طور تي، گھڻا برائوزر پڻ UI آٽوميشن کي سپورٽ ڪن ٿا (موزيلا ڊفالٽ طور تي، ۽ ڪروم کي ڪمانڊ لائن کي فيڊ ڪرڻ جي ضرورت آھي جڏھن شروع ٿئي ٿو. --force-renderer-accessibilityInspect.exe ۾ صفحن تي عناصر ڏسڻ لاءِ). يقينا، هن علائقي ۾ Selenium سان مقابلو مشڪل سان ممڪن آهي. بس برائوزر سان ڪم ڪرڻ جو هڪ ٻيو طريقو (شايد هڪ پار-پراڊڪٽ جي منظرنامي لاءِ ڪارآمد هجي).

خودڪار لاء داخلا پوائنٽون

اپليڪيشن چڱي طرح تحقيق ڪئي وئي آهي. اهو وقت آهي ايپليڪيشن اعتراض ٺاهڻ ۽ ان کي هلائڻ يا اڳ ۾ ئي هلندڙ هڪ سان ڳنڍڻ جو. هي صرف هڪ معياري طبقي جو ڪلون ناهي subprocess.Popen، يعني هڪ ان پٽ اعتراض جيڪو توهان جي سڀني عملن کي پروسيس جي حدن تائين محدود ڪري ٿو. اهو تمام ڪارائتو آهي جيڪڏهن توهان وٽ ايپليڪيشن هلائڻ جا ڪيترائي مثال آهن، پر توهان باقي کي ڇڪڻ نٿا چاهيو.

from pywinauto.application import Application
app = Application(backend="uia").start('notepad.exe')

# Опишем окно, которое хотим найти в процессе Notepad.exe
dlg_spec = app.UntitledNotepad
# ждем пока окно реально появится
actionable_dlg = dlg_spec.wait('visible')

جيڪڏھن توھان چاھيو ٿا ھڪ ئي وقت ڪيترن ئي ايپليڪيشنن کي منظم ڪريو، ھي ڪلاس توھان جي مدد ڪندو Desktop. مثال طور، Win10 تي هڪ ڳڻپيوڪر ۾، عناصر جو درجو ڪيترن ئي عملن ۾ پکڙيل آهي (نه صرف calc.exe). تنهنڪري ڪو اعتراض ناهي Desktop ڪافي ناهي.

from subprocess import Popen
from pywinauto import Desktop

Popen('calc.exe', shell=True)
dlg = Desktop(backend="uia").Calculator
dlg.wait('visible')

روٽ اعتراض (Application يا Desktop) واحد جڳهه آهي جتي توهان کي پس منظر جي وضاحت ڪرڻ جي ضرورت آهي. باقي سڀ ڪجهه شفاف طور تي "تفصيل-> لفافي" تصور ۾ اچي ٿو، جيڪو بعد ۾ بحث ڪيو ويندو.

ونڊو / عنصر وضاحتون

اهو بنيادي تصور آهي جنهن تي pywinauto انٽرفيس ٺهيل آهي. توھان بيان ڪري سگھوٿا ونڊو/عنصر تقريباً يا وڌيڪ تفصيل سان، جيتوڻيڪ اھو اڃا موجود نه آھي يا اڳي ئي بند ٿيل آھي. ونڊو جي وضاحت (آبجڪٽ ونڊو جي وضاحت) معيار کي ذخيرو ڪري ٿو جنهن جي ذريعي حقيقي ونڊو يا عنصر ڳولڻ لاء.

تفصيلي ونڊو وضاحت جو مثال:

>>> dlg_spec = app.window(title='Untitled - Notepad')

>>> dlg_spec
<pywinauto.application.WindowSpecification object at 0x0568B790>

>>> dlg_spec.wrapper_object()
<pywinauto.controls.win32_controls.DialogWrapper object at 0x05639B70>

ونڊو ڳولها پاڻ کي طريقي سان سڏڻ سان ٿيندي آهي .wrapper_object(). اهو حقيقي ونڊو/عنصر يا اڇلائڻ لاءِ هڪ خاص ”ريپر“ موٽائي ٿو ElementNotFoundError (ڪڏهن ڪڏهن ElementAmbiguousError، جيڪڏهن ڪيترائي عنصر مليا آهن، اهو آهي، توهان کي ڳولا جي معيار کي واضح ڪرڻ جي ضرورت آهي). هي ”ريپر“ اڳ ۾ ئي ڄاڻي ٿو ته ڪنهن عنصر سان ڪي عمل ڪيئن ڪجي يا ان مان ڊيٽا حاصل ڪجي.

پٿون ڪال لڪائي سگھي ٿو .wrapper_object()، تنهنڪري حتمي ڪوڊ ننڍو ٿي ويندو. اسان ان کي صرف ڊيبگنگ جي مقصدن لاءِ استعمال ڪرڻ جي صلاح ڏيون ٿا. ايندڙ ٻه سٽون بلڪل ساڳيو ڪم ڪن ٿيون:

dlg_spec.wrapper_object().minimize() # debugging
dlg_spec.minimize() # production

ونڊو جي وضاحت لاءِ ڪيترائي ڳولا جا معيار آھن. هتي صرف چند مثال آهن:

# могут иметь несколько уровней
app.window(title_re='.* - Notepad$').window(class_name='Edit')

# можно комбинировать критерии (как AND) и не ограничиваться одним процессом приложения
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')

سڀني ممڪن معيارن جي هڪ فهرست فنڪشن دستاويزن ۾ آهي pywinauto.findwindows.find_elements(…).

صفت ۽ چاٻي ذريعي رسائي جو جادو

پٿون ونڊو جي وضاحتن کي ٺاهڻ آسان بڻائي ٿو ۽ متحرڪ طور تي اعتراض جي خاصيتن کي سڃاڻي ٿو (اندروني طور تي، طريقو ختم ٿيل آهي __getattribute__). يقينن، ساڳئي پابنديون وصف جي نالي تي لاڳو ڪيون ويون آهن جيئن ڪنهن به متغير جي نالي تي (توهان اسپيس، ڪاما، يا ٻيا خاص اکر داخل نٿا ڪري سگهو). خوشقسمتيءَ سان، pywinauto استعمال ڪري ٿو هڪ نام نهاد ”بهترين ميچ“ ڳولها الورورٿم جيڪو ٽائپس ۽ ننڍڙن تبديلين جي مزاحمتي آهي.

app.UntitledNotepad
# то же самое, что
app.window(best_match='UntitledNotepad')

جيڪڏهن توهان کي اڃا به يونيڪوڊ تارن جي ضرورت آهي (مثال طور، روسي ٻولي لاءِ)، اسپيس وغيره، ته توهان ڪي جي ذريعي رسائي ڪري سگهو ٿا (جيئن ته اها هڪ باقاعده لغت هئي):

app['Untitled - Notepad']
# то же самое, что
app.window(best_match='Untitled - Notepad')

جادو جا نالا لاء پنج ضابطا

معياري جادو جا نالا ڪيئن ڳولڻ لاء؟ جيڪي ڳولھا ڪرڻ کان اڳ عنصر کي لڳايو ويو آھي. جيڪڏهن توهان هڪ نالو بيان ڪيو آهي جيڪو ڪافي معيار سان ملندو آهي، پوء عنصر ملندو.

  1. عنوان سان (متن، نالو): app.Properties.OK.click()
  2. متن ۽ عنصر جي قسم طرفان: app.Properties.OKButton.click()
  3. قسم ۽ نمبر موجب: app.Properties.Button3.click() (نالو Button0 и Button1 مليل پهرين عنصر تي پابند، Button2 - ٻئي ڏانهن، ۽ پوء ترتيب ۾ - اهو ڪيئن تاريخي طور تي ٿيو)
  4. جامد متن (کاٻي يا مٿي) ۽ قسم جي ذريعي: app.OpenDialog.FileNameEdit.set_text("") (متحرڪ متن سان عناصر لاء مفيد)
  5. قسم ۽ متن جي اندر اندر: app.Properties.TabControlSharing.select("General")

عام طور تي ٻه يا ٽي ضابطا ساڳئي وقت لاڳو ٿين ٿا، گهٽ ۾ گهٽ وڌيڪ. چيڪ ڪرڻ لاءِ ته هر عنصر لاءِ ڪهڙا مخصوص نالا موجود آهن، توهان استعمال ڪري سگهو ٿا طريقو print_control_identifiers(). اهو عناصر جي وڻ کي پرنٽ ڪري سگهي ٿو ٻنهي اسڪرين ۽ فائل ڏانهن. هر عنصر لاء، ان جا معياري جادو جا نالا ڇپيل آهن. توھان پڻ نقل ڪري سگھوٿا ۽ پيسٽ ڪري سگھوٿا وڌيڪ تفصيلي وضاحتن جي ٻارن جي عناصرن کي اتان کان. اسڪرپٽ ۾ نتيجو هن طرح نظر ايندو:

app.Properties.child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")

عناصر جو وڻ پاڻ کي عام طور تي هڪ وڏي پيرن جي ڪپڙي آهي.

>>> app.Properties.print_control_identifiers()

Control Identifiers:

Dialog - 'Windows NT Properties'    (L688, T518, R1065, B1006)
[u'Windows NT PropertiesDialog', u'Dialog', u'Windows NT Properties']
child_window(data-gt-translate-attributes='["title"]' title="Windows NT Properties", control_type="Window")
   |
   | Image - ''    (L717, T589, R749, B622)
   | [u'', u'0', u'Image1', u'Image0', 'Image', u'1']
   | child_window(auto_id="13057", control_type="Image")
   |
   | Image - ''    (L717, T630, R1035, B632)
   | ['Image2', u'2']
   | child_window(auto_id="13095", control_type="Image")
   |
   | Edit - 'Folder name:'    (L790, T596, R1036, B619)
   | [u'3', 'Edit', u'Edit1', u'Edit0']
   | child_window(data-gt-translate-attributes='["title"]' title="Folder name:", auto_id="13156", control_type="Edit")
   |
   | Static - 'Type:'    (L717, T643, R780, B658)
   | [u'Type:Static', u'Static', u'Static1', u'Static0', u'Type:']
   | child_window(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13080", control_type="Text")
   |
   | Edit - 'Type:'    (L790, T643, R1036, B666)
   | [u'4', 'Edit2', u'Type:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13059", control_type="Edit")
   |
   | Static - 'Location:'    (L717, T669, R780, B684)
   | [u'Location:Static', u'Location:', u'Static2']
   | child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13089", control_type="Text")
   |
   | Edit - 'Location:'    (L790, T669, R1036, B692)
   | ['Edit3', u'Location:Edit', u'5']
   | child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13065", control_type="Edit")
   |
   | Static - 'Size:'    (L717, T695, R780, B710)
   | [u'Size:Static', u'Size:', u'Static3']
   | child_window(data-gt-translate-attributes='["title"]' title="Size:", auto_id="13081", control_type="Text")
   |
   | Edit - 'Size:'    (L790, T695, R1036, B718)
   | ['Edit4', u'6', u'Size:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Size:", auto_id="13064", control_type="Edit")
   |
   | Static - 'Size on disk:'    (L717, T721, R780, B736)
   | [u'Size on disk:', u'Size on disk:Static', u'Static4']
   | child_window(data-gt-translate-attributes='["title"]' title="Size on disk:", auto_id="13107", control_type="Text")
   |
   | Edit - 'Size on disk:'    (L790, T721, R1036, B744)
   | ['Edit5', u'7', u'Size on disk:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Size on disk:", auto_id="13106", control_type="Edit")
   |
   | Static - 'Contains:'    (L717, T747, R780, B762)
   | [u'Contains:1', u'Contains:0', u'Contains:Static', u'Static5', u'Contains:']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13088", control_type="Text")
   |
   | Edit - 'Contains:'    (L790, T747, R1036, B770)
   | [u'8', 'Edit6', u'Contains:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")
   |
   | Image - 'Contains:'    (L717, T773, R1035, B775)
   | [u'Contains:Image', 'Image3', u'Contains:2']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13096", control_type="Image")
   |
   | Static - 'Created:'    (L717, T786, R780, B801)
   | [u'Created:', u'Created:Static', u'Static6', u'Created:1', u'Created:0']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13092", control_type="Text")
   |
   | Edit - 'Created:'    (L790, T786, R1036, B809)
   | [u'Created:Edit', 'Edit7', u'9']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13072", control_type="Edit")
   |
   | Image - 'Created:'    (L717, T812, R1035, B814)
   | [u'Created:Image', 'Image4', u'Created:2']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13097", control_type="Image")
   |
   | Static - 'Attributes:'    (L717, T825, R780, B840)
   | [u'Attributes:Static', u'Static7', u'Attributes:']
   | child_window(data-gt-translate-attributes='["title"]' title="Attributes:", auto_id="13091", control_type="Text")
   |
   | CheckBox - 'Read-only (Only applies to files in folder)'    (L790, T825, R1035, B841)
   | [u'CheckBox0', u'CheckBox1', 'CheckBox', u'Read-only (Only applies to files in folder)CheckBox', u'Read-only (Only applies to files in folder)']
   | child_window(data-gt-translate-attributes='["title"]' title="Read-only (Only applies to files in folder)", auto_id="13075", control_type="CheckBox")
   |
   | CheckBox - 'Hidden'    (L790, T848, R865, B864)
   | ['CheckBox2', u'HiddenCheckBox', u'Hidden']
   | child_window(data-gt-translate-attributes='["title"]' title="Hidden", auto_id="13076", control_type="CheckBox")
   |
   | Button - 'Advanced...'    (L930, T845, R1035, B868)
   | [u'Advanced...', u'Advanced...Button', 'Button', u'Button1', u'Button0']
   | child_window(data-gt-translate-attributes='["title"]' title="Advanced...", auto_id="13154", control_type="Button")
   |
   | Button - 'OK'    (L814, T968, R889, B991)
   | ['Button2', u'OK', u'OKButton']
   | child_window(data-gt-translate-attributes='["title"]' title="OK", auto_id="1", control_type="Button")
   |
   | Button - 'Cancel'    (L895, T968, R970, B991)
   | ['Button3', u'CancelButton', u'Cancel']
   | child_window(data-gt-translate-attributes='["title"]' title="Cancel", auto_id="2", control_type="Button")
   |
   | Button - 'Apply'    (L976, T968, R1051, B991)
   | ['Button4', u'ApplyButton', u'Apply']
   | child_window(data-gt-translate-attributes='["title"]' title="Apply", auto_id="12321", control_type="Button")
   |
   | TabControl - ''    (L702, T556, R1051, B962)
   | [u'10', u'TabControlSharing', u'TabControlPrevious Versions', u'TabControlSecurity', u'TabControl', u'TabControlCustomize']
   | child_window(auto_id="12320", control_type="Tab")
   |    |
   |    | TabItem - 'General'    (L704, T558, R753, B576)
   |    | [u'GeneralTabItem', 'TabItem', u'General', u'TabItem0', u'TabItem1']
   |    | child_window(data-gt-translate-attributes='["title"]' title="General", control_type="TabItem")
   |    |
   |    | TabItem - 'Sharing'    (L753, T558, R801, B576)
   |    | [u'Sharing', u'SharingTabItem', 'TabItem2']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Sharing", control_type="TabItem")
   |    |
   |    | TabItem - 'Security'    (L801, T558, R851, B576)
   |    | [u'Security', 'TabItem3', u'SecurityTabItem']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Security", control_type="TabItem")
   |    |
   |    | TabItem - 'Previous Versions'    (L851, T558, R947, B576)
   |    | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Previous Versions", control_type="TabItem")
   |    |
   |    | TabItem - 'Customize'    (L947, T558, R1007, B576)
   |    | [u'CustomizeTabItem', 'TabItem5', u'Customize']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Customize", control_type="TabItem")
   |
   | TitleBar - 'None'    (L712, T521, R1057, B549)
   | ['TitleBar', u'11']
   |    |
   |    | Menu - 'System'    (L696, T526, R718, B548)
   |    | [u'System0', u'System', u'System1', u'Menu', u'SystemMenu']
   |    | child_window(data-gt-translate-attributes='["title"]' title="System", auto_id="MenuBar", control_type="MenuBar")
   |    |    |
   |    |    | MenuItem - 'System'    (L696, T526, R718, B548)
   |    |    | [u'System2', u'MenuItem', u'SystemMenuItem']
   |    |    | child_window(data-gt-translate-attributes='["title"]' title="System", control_type="MenuItem")
   |    |
   |    | Button - 'Close'    (L1024, T519, R1058, B549)
   |    | [u'CloseButton', u'Close', 'Button5']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Close", control_type="Button")

ڪجهه حالتن ۾، سڄي وڻ جي ڇپائي سست ٿي سگهي ٿي (مثال طور، آئي ٽيونز ۾ هڪ ٽيب تي ٽي هزار عناصر آهن!)، پر توهان اهو اختيار استعمال ڪري سگهو ٿا. depth (گڏيل): depth=1 - عنصر پاڻ، depth=2 - صرف فوري ٻار، وغيره. اهو پڻ وضاحتن ۾ بيان ڪري سگهجي ٿو جڏهن ٺاهڻ child_window.

مثال

اسان مسلسل ڀريندا رهيا آهيون repository ۾ مثالن جي فهرست. تازن جي وچ ۾، اهو وائر شارڪ نيٽ ورڪ تجزيه ڪندڙ جي خودڪار کي ياد رکڻ جي قابل آهي (هي Qt5 ايپليڪيشن جو هڪ سٺو مثال آهي؛ جيتوڻيڪ اهو ڪم GUI کان سواء حل ڪري سگهجي ٿو، ڇاڪاڻ ته اتي موجود آهي. scapy.Sniffer Python پيڪيج کان ڇڪيل). اتي پڻ ھڪڙو مثال آھي ايم ايس پينٽ آٽوميشن ان جي ربن ٽول بار سان.

ٻيو وڏو مثال منهنجي هڪ شاگرد جو لکيل آهي: گوگل ڊرائيو لاءِ explorer.exe کان ڪروم پيج تي فائل ڇڪيندي (اهو ٿوري دير بعد مکيه مخزن ڏانهن منتقل ٿيندو).

۽، يقينا، ڪيبورڊ جي رڪنيت حاصل ڪرڻ جو هڪ مثال (گرم چابيون) ۽ مائوس واقعن:
hook_and_listen.py.

مڃيل نشانيون

خاص طور تي انهن جي مهرباني جيڪي مسلسل منصوبي کي ترقي ڪرڻ ۾ مدد ڪن ٿا. مون لاءِ ۽ Valentine هي هڪ مستقل شوق آهي. UNN مان منهنجي ٻن شاگردن تازو ئي هن موضوع تي بيچلر جي ڊگرين جو دفاع ڪيو. اليگزينڊر MS UI آٽوميشن لاءِ سپورٽ ڪرڻ لاءِ وڏو تعاون ڪيو ۽ تازو ئي ”ريڪارڊ-پلے بيڪ“ اصول جي بنياد تي ٽيڪسٽ پراپرٽيز جي بنياد تي هڪ خودڪار ڪوڊ جنريٽر ٺاهڻ شروع ڪيو (هي سڀ کان وڌيڪ پيچيده خصوصيت آهي)، هينئر تائين صرف ”uia“ پس منظر لاءِ. آئي لينڪس لاءِ هڪ نئون پس منظر ٺاهي رهيو آهي AT-SPI جي بنياد تي (ماڊيول mouse и keyboard بنياد تي python-xlib - اڳ ۾ ئي رليز ۾ 0.6.x).

جيئن ته مان ڪافي عرصي کان پٿون ۾ آٽوميشن تي هڪ خاص ڪورس سيکاري رهيو آهيان، ڪجهه ماسٽر جا شاگرد هوم ورڪ ڪندا آهن، ننڍڙن خاصيتن کي لاڳو ڪرڻ يا آٽوميشن جا مثال. ريسرچ اسٽيج تي ڪجهه اهم شيون پڻ هڪ ڀيرو شاگردن پاران دريافت ڪيا ويا. جيتوڻيڪ ڪڏهن ڪڏهن توهان کي سختي سان ڪوڊ جي معيار کي مانيٽر ڪرڻو پوندو. جامد تجزيه ڪندڙ (Quantified Code، Codacy and Landscape) ۽ ڪلائوڊ ۾ خودڪار ٽيسٽ (AppVeyor سروس) تقريباً 95٪ جي ڪوڊ ڪوريج سان ان ۾ تمام گهڻي مدد ڪن ٿا.

انهي سان گڏ هر ڪنهن جي مهرباني، جيڪي تبصرا ڇڏيندا آهن، ڪيڙا وڌائيندا آهن ۽ ڇڪڻ جون درخواستون موڪليندا آهن!

اضافي وسيلا

اسان سوالن جي پيروي ڪندا آهيون StackOverflow تي ٽيگ (تازو ظاهر ٿيو SO جي روسي ورزن ۾ ٽيگ) ۽ Toaster تي لفظ جي ذريعي. هتي آهي Gitter تي روسي-ٻولي چيٽ.

اسان هر مهيني تازه ڪاري ڪندا آهيون GUI جاچ لاءِ اوپن سورس لائبريرين جي درجه بندي. GitHub تي ستارن جي تعداد جي لحاظ کان، صرف Autohotkey (انهن جي هڪ تمام وڏي ڪميونٽي ۽ هڪ ڊگهي تاريخ آهي) ۽ PyAutoGUI تيزي سان وڌي رهيا آهن (وڏي طور تي ان جي مصنف Al Sweigart جي ڪتابن جي مقبوليت جي ڪري: "آٽوميٽ دي بورنگ اسٽف سان. پٿون" ۽ ٻيا).

جو ذريعو: www.habr.com

DDoS تحفظ سان سائيٽن لاءِ قابل اعتماد هوسٽنگ خريد ڪريو، VPS VDS سرور 🔥 DDoS تحفظ سان قابل اعتماد ويب سائيٽ هوسٽنگ خريد ڪريو، VPS VDS سرورز | ProHoster