د Python کتابتون په وینډوز کې د ډیسټاپ GUI غوښتنلیکونو اتومات کولو لپاره د خلاصې سرچینې پروژه ده. په تیرو دوو کلونو کې، نوي لوی ځانګړتیاوې په دې کې ښکاره شوي:
- د MS UI اتومات ټیکنالوژۍ لپاره ملاتړ. انٹرفیس ورته دی، او اوس دا ملاتړ کوي: WinForms، WPF، Qt5، وینډوز سټور (UWP) او داسې نور - نږدې هرڅه چې په وینډوز کې دي.
- د بیک انډ / پلگ ان سیسټم (اوس مهال دوه یې د هود لاندې دي: ډیفالټ
"win32"او نوی"uia"). بیا موږ په اسانۍ سره د کراس پلیټ فارم په لور حرکت کوو. - د موږک او کیبورډ لپاره Win32 هکس (د pyHook په روح کې ګرم کیلي).
موږ به د ډیسټاپ اتومات کولو لپاره په خلاصې سرچینې کې د هغه څه لنډه کتنه هم ورکړو (پرته له دې چې د جدي پرتله کولو ښکارندویه وي).
دا مقاله په مینسک کې د SQA ورځو 20 کنفرانس څخه د راپور یوه برخه نقل ده ( и )، په جزوي توګه روسي نسخه د pywinauto لپاره.
- بنسټیز چلندونه
- د ډیسټاپ د لاسرسي لومړني ټیکنالوژي
راځئ چې پدې سیمه کې د خلاصې سرچینې لنډې کتنې سره پیل وکړو. د ډیسټاپ GUI غوښتنلیکونو لپاره ، هرڅه د ویب په پرتله یو څه خورا پیچلي دي ، کوم چې سیلینیم لري. دلته اصلي لارې دي:
د همغږۍ طریقه
د کلک ټکي هارډ کوډ کړئ، موږ د بریالۍ بریاوو هیله لرو.
[+] کراس پلیټ فارم، د پلي کولو لپاره اسانه.
[+] د "ریکارډ-ریپلی" ازموینې ثبت کول اسانه دي.
[-] د سکرین ریزولوشن بدلولو لپاره خورا بې ثباته ، موضوع ، فونټونه ، د کړکۍ اندازه او داسې نور.
[-] د ملاتړ لوی هڅو ته اړتیا ده؛ ډیری وختونه د سکریچ څخه ازموینې بیا رامینځته کول یا په لاسي ډول ازموینه کول اسانه دي.
[-] یوازې عملونه اتومات کوي؛ د معلوماتو تصدیق او ترلاسه کولو لپاره نورې لارې شتون لري.
اوزار (کراس پلیټ فارم): , , او ډیری نور. عموما، ډیر پیچلي وسایل پدې فعالیت کې شامل دي (نه تل کراس پلیټ فارم).
دا د ویلو وړ ده چې د همغږۍ طریقه کولی شي نورې لارې بشپړې کړي. د مثال په توګه، د دودیز ګرافیکونو لپاره، تاسو کولی شئ په نسبي همغږي باندې کلیک وکړئ (د کړکۍ/عنصر د پورتنۍ کیڼ کونج څخه، او نه د ټول سکرین څخه) - دا معمولا خورا معتبر وي، په ځانګړې توګه که تاسو د کړکۍ اوږدوالی / عرض په پام کې ونیسئ. ټول عنصر (بیا د سکرین مختلف حلونه به زیان ونه رسوي).
بل اختیار: د ازموینې لپاره مستحکم ترتیباتو سره یوازې یو ماشین تخصیص کړئ (نه کراس پلیټ فارم ، مګر په ځینو مواردو کې دا ښه دی).
د عکس پیژندنه حواله
[+] کراس پلیټ فارم[+-] په نسبي توګه د اعتبار وړ (د همغږۍ میتود څخه غوره)، مګر بیا هم ځینې چالونو ته اړتیا لري.
[-+] نسبتا ورو، ځکه د پیژندنې الګوریتمونو لپاره د CPU سرچینو ته اړتیا لري.
[-] د متن پیژندنه (OCR)، د یوې قاعدې په توګه، د پوښتنې څخه بهر دی => د متن ډاټا نشي ترلاسه کیدی. تر هغه ځایه چې زه پوهیږم، د OCR موجوده حلونه د دې ډول دندې لپاره خورا باوري ندي، او په پراخه کچه نه کارول کیږي (په نظرونو کې ښه راغلاست که دا دمخه قضیه نه وي).
وسايل: , (سیکولي سره مطابقت لري، خالص پایتون) .
د لاسرسي ټیکنالوژي
[+] ترټولو معتبر میتود، ځکه تاسو ته اجازه درکوي د متن له لارې لټون وکړئ، پرته له دې چې دا د سیسټم یا چوکاټ لخوا وړاندې کیږي.[+] تاسو ته اجازه درکوي د متن ډیټا راوباسئ => د ازموینې پایلو تصدیق کول اسانه دي.
[+] د یوې قاعدې په توګه، ترټولو چټک، ځکه تقریبا هیڅ CPU سرچینې نه مصرفوي.
[-] د کراس پلیټ فارم وسیله رامینځته کول ګران دي: په بشپړ ډول د خلاصې سرچینې کتابتونونه د یو یا دوه لاسرسي ټیکنالوژیو ملاتړ کوي. وینډوز/لینکس/ماکوس په بشپړ ډول د هیڅ چا لخوا نه ملاتړ کیږي پرته له تادیه شوي لکه ټیسټکمپلیټ ، UFT یا اسکویش.
[-] دا ډول ټیکنالوژي تل په اصولو کې شتون نلري. د مثال په توګه، د VirtualBox دننه د بارولو سکرین ازموینه - دا د عکس پیژندنې پرته نشي ترسره کیدی. مګر په ډیری کلاسیک قضیو کې، د لاسرسي طریقه لاهم د تطبیق وړ ده. دا به نور بحث وشي.
وسايل: په C# کې په C# کې (سیلینیم مطابقت لري) په C# کې (Appium مطابقت لري) , (LDTP مطابقت لري) , په روبي کې (د لینکس ډیسټاپ ازموینې پروژه) او د هغې وینډوز نسخه .
LDTP شاید د لاسرسي ټیکنالوژیو پراساس یوازینۍ کراس پلیټ فارم خلاص سرچینه وسیله وي (په دقیق ډول د کتابتونونو کورنۍ). په هرصورت، دا خورا مشهور نه دی. ما دا پخپله نه دی کارولی، مګر د بیاکتنې له مخې، د دې انٹرفیس خورا اسانه نه دی. که تاسو مثبت نظر لرئ، مهرباني وکړئ په نظرونو کې یې شریک کړئ.
د شاته دروازې ازموینه (د کور دننه بایسکل)
د کراس پلیټ فارم غوښتنلیکونو لپاره ، پراختیا کونکي پخپله ډیری وختونه د ازموینې وړتیا ډاډمن کولو لپاره داخلي میکانیزم رامینځته کوي. د مثال په توګه ، دوی په غوښتنلیک کې د خدمت TCP سرور رامینځته کوي ، ازموینې دې سره وصل کوي او د متن کمانډونه لیږي: په څه باندې کلیک وکړئ ، چیرې معلومات ترلاسه کړئ ، او داسې نور. د اعتبار وړ، مګر نړیوال نه.
د ډیسټاپ د لاسرسي لومړني ټیکنالوژي
ښه زوړ Win32 API
د وینډوز ډیری غوښتنلیکونه د WPF خوشې کیدو دمخه لیکل شوي او بیا د وینډوز پلورنځی په یو ډول یا بل ډول په Win32 API کې جوړ شوي. د بیلګې په توګه، MFC، WTL، C++ جوړونکی، Delphi، VB6 - دا ټول وسایل د Win32 API کاروي. حتی د وینډوز فارمونه په پراخه کچه د Win32 API سره مطابقت لري.
وسايل: (VB ته ورته) او Python ریپر , (خپله ژبه، د IDispatch COM انٹرفیس شتون لري) (پټون) (روبي) (روبي).
د مایکروسافټ UI اتوماتیک
اصلي ګټه: د MS UI اتومات ټیکنالوژي د نادر استثنا سره په وینډوز کې د GUI ډیری غوښتنلیکونو ملاتړ کوي. ستونزه: د Win32 API په پرتله زده کول خورا اسانه ندي. که نه نو، هیڅوک به په دې باندې لفافه جوړه نه کړي.
په حقیقت کې، دا د دودیز COM انٹرفیسونو سیټ دی (په عمده توګه UIAutomationCore.dll)، او په فورمه کې د .NET ریپر هم لري namespace System.Windows.Automation. په هرصورت، دا یو معرفي شوی بګ لري چې له امله یې د UI ځینې عناصر له لاسه ورکول کیدی شي. له همدې امله، دا غوره ده چې د UIAutomationCore.dll مستقیم وکاروئ (که تاسو په C# کې د UiaComWrapper په اړه اوریدلي وي، نو دا دی).
د COM انٹرفیس ډولونه:
(1) بنسټیز IUknown - "د ټولو بدیو ریښه". ترټولو ټیټه کچه، هیڅکله د کاروونکي دوستانه نه ده.
(2) IDispatch او مشتقات (د بیلګې په توګه Excel.Application)، کوم چې په پایتون کې د win32com.client کڅوړې په کارولو سره کارول کیدی شي (د pyWin32 سره شامل دی). ترټولو اسانه او ښکلی انتخاب.
(3) دودیز انٹرفیسونه چې د دریمې ډلې Python کڅوړه ورسره کار کولی شي .
وسايل: په C# کې 0.6.0+ ، په C# کې (د UIAutomationCore.dll په اړه د C ریپرونو لپاره د دوی سرچینې کوډ نه دی افشا شوی) په روبي کې
AT-SPI
د دې حقیقت سره سره چې د لینوکس کورنۍ نږدې ټول محورونه د X کړکۍ سیسټم کې جوړ شوي دي (په فیډورا 25 کې، "X's" Wayland ته بدل شوي)، "X's" تاسو ته اجازه درکوي یوازې د لوړې کچې کړکۍ او موږک چل کړئ. کیبورډ د بټونو، لیست بکسونو، او داسې نورو تفصيلي تحلیل لپاره، د AT-SPI ټیکنالوژي شتون لري. د کړکۍ خورا مشهور مدیران د AT-SPI راجسټری ډیمون په نوم یادیږي ، کوم چې د غوښتنلیکونو لپاره اتومات GUI چمتو کوي (لږترلږه Qt او GTK ملاتړ کیږي).
وسايل: .
pyatspi2، زما په نظر، د PyGObject په څیر ډیری انحصارونه لري. ټیکنالوژي پخپله د منظم متحرک کتابتون په توګه شتون لري libatspi.so. شته . د pywinauto کتابتون لپاره موږ پلان لرو چې په دې ډول د AT-SPI ملاتړ پلي کړو: د libatspi.so او د ډول ډول ماډلونو بارولو له لارې. یوازې د اړتیا وړ نسخه کارولو کې کوچنۍ ستونزه شتون لري ، ځکه چې د GTK + او Qt غوښتنلیکونو لپاره دوی یو څه توپیر لري. د بشپړ لینکس ملاتړ سره د pywinauto 0.7.0 احتمالي خوشې کول د 2018 په لومړۍ نیمایي کې تمه کیدی شي.
د ایپل لاسرسي API
MacOS خپله اتومات ژبه لري، AppleScript. په پایتون کې د دې په څیر یو څه پلي کولو لپاره ، البته ، تاسو اړتیا لرئ د ObjectiveC څخه افعال وکاروئ. پیل کول، داسې ښکاري چې د MacOS 10.6 سره، د pyobjc کڅوړه د مخکې نصب شوي پایتون کې شامله ده. دا به په pywinauto کې د راتلونکي ملاتړ لپاره د انحصارونو لیست کول اسانه کړي.
اوزار: د ایپل سکریپټ ژبې سربیره، دا د پام وړ ارزښت لري , aka pyatom. دا د LDTP سره مطابقت لرونکی انٹرفیس دی، مګر یو خپلواک کتابتون هم دی. دا لري ، زما د زده کونکي لخوا لیکل شوی. یوه پیژندل شوې ستونزه شتون لري: انعطاف وړ وختونه کار نه کوي (میتودونه 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-accessibilityپه Inspect.exe کې په پاڼو کې د عناصرو لیدلو لپاره). البته، پدې سیمه کې د سیلینیم سره سیالي په سختۍ سره ممکنه ده. د براوزر سره کار کولو لپاره یوازې بله لاره (ممکن د کراس محصول سناریو لپاره ګټوره وي).
د اتومات کولو لپاره د ننوتلو نقطې
غوښتنلیک په پراخه کچه څیړل شوی. دا وخت دی چې د غوښتنلیک څیز رامینځته کړئ او دا یې پرمخ وړئ یا دمخه روان شوي سره ضمیمه کړئ. دا یوازې د معیاري ټولګي کلون نه دی 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) یوازینی ځای دی چیرې چې تاسو اړتیا لرئ د پس منظر مشخص کړئ. نور هرڅه په شفاف ډول د "تخصص-> ریپر" مفهوم کې راځي، چې وروسته به پرې بحث وشي.
کړکۍ/عنصر مشخصات
دا اصلي مفهوم دی چې د پیوینوټو انٹرفیس جوړ شوی. تاسو کولی شئ یوه کړکۍ/عنصر تقریبا یا په ډیر تفصیل سره تشریح کړئ، حتی که دا لاهم شتون نلري یا لا دمخه تړل شوی وي. د کړکۍ مشخصات (څیز د کړکۍ مشخصات) هغه معیارونه ذخیره کوي چې له مخې یې د اصلي کړکۍ یا عنصر لټون کول.
د تفصيلي کړکۍ مشخصاتو بېلګه:
>>> 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، که چیرې ډیری عناصر وموندل شي ، دا دی ، تاسو اړتیا لرئ د لټون معیار روښانه کړئ). دا "ریپر" دمخه پوهیږي چې څنګه د عنصر سره ځینې کړنې ترسره کړي یا له هغې څخه ډاټا ترلاسه کړي.
Python کولی شي تلیفون پټ کړي .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')د ټولو ممکنه معیارونو لیست د فنکشن سندونو کې دی .
د صفت او کیلي په واسطه د لاسرسي جادو
Python د کړکۍ مشخصات رامینځته کول اسانه کوي او په متحرک ډول د اعتراض ځانګړتیاوې پیژني (په داخلي توګه ، میتود له پامه غورځول شوی __getattribute__). البته، ورته محدودیتونه د ځانګړتیا په نوم باندې لګول شوي لکه د کوم متغیر په نوم (تاسو نشئ کولی ځایونه، کوما، یا نور ځانګړي حروف داخل کړئ). په خوشبختۍ سره، pywinauto د "غوره میچ" لټون الګوریتم کاروي چې د ټایپو او کوچنیو بدلونونو په وړاندې مقاومت لري.
app.UntitledNotepad
# то же самое, что
app.window(best_match='UntitledNotepad')که تاسو لاهم د یونیکوډ تارونو ته اړتیا لرئ (د مثال په توګه ، د روسی ژبې لپاره) ، ځایونه او نور ، تاسو کولی شئ د کیلي له لارې لاسرسی ومومئ (لکه څنګه چې دا یو منظم قاموس وي):
app['Untitled - Notepad']
# то же самое, что
app.window(best_match='Untitled - Notepad')د جادو نومونو لپاره پنځه قواعد
د معیاري جادو نومونو موندلو څرنګوالی؟ هغه چې د لټون کولو دمخه عنصر ته ګمارل شوي. که تاسو یو نوم مشخص کړئ چې د معیار سره ورته وي، نو عنصر به وموندل شي.
- د عنوان له مخې (متن، نوم):
app.Properties.OK.click() - د متن او عنصر ډول له مخې:
app.Properties.OKButton.click() - د ډول او شمیرې له مخې:
app.Properties.Button3.click()(نومونهButton0иButton1موندل شوي لومړي عنصر پورې تړلي،Button2- دوهم ته، او بیا په ترتیب سره - دا په تاریخي ډول پیښیږي) - د جامد متن (کیڼ یا پورتنۍ) او د ډول له مخې:
app.OpenDialog.FileNameEdit.set_text("")(د متحرک متن سره د عناصرو لپاره ګټور) - دننه د ډول او متن له مخې:
app.Properties.TabControlSharing.select("General")
معمولا دوه یا درې قواعد په ورته وخت کې پلي کیږي، په ندرت سره ډیر. د دې لپاره چې وګورئ کوم ځانګړي نومونه د هر عنصر لپاره شتون لري، تاسو کولی شئ دا طریقه وکاروئ چاپ_کنټرول_پیژندونکي(). دا کولی شي د عناصرو ونې دواړه سکرین او فایل ته چاپ کړي. د هر عنصر لپاره، د دې معیاري جادو نومونه چاپ شوي. تاسو کولی شئ هلته د ماشوم عناصرو نور تفصيلي مشخصات کاپي او پیسټ کړئ. په سکریپټ کې پایله به داسې ښکاري:
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.
مثالونه
موږ په دوامداره توګه ډکوو . د وروستیو شیانو په منځ کې، دا د WireShark شبکې شنونکي اتوماتیک په پام کې نیولو سره ارزښت لري (دا د Qt5 غوښتنلیک یوه ښه بیلګه ده؛ که څه هم دا کار د GUI پرته حل کیدی شي، ځکه چې شتون لري. scapy.Sniffer د Python پیکج څخه ). د دې ربن وسیلې بار سره د MS پینټ اتوماتیک مثال هم شتون لري.
یو بل عالي مثال زما د یوه زده کونکي لخوا لیکل شوی: (دا به یو څه وروسته اصلي ذخیره ته لاړ شي).
او البته، د کیبورډ (ګرم کیلي) او موږک پیښو ته د ګډون کولو مثال:
.
اعترافونه
د هغو کسانو څخه ځانګړې مننه چې په دوامداره توګه د پروژې په پراختیا کې مرسته کوي. زما لپاره او دا یو دایمي شوق دی. د UNN څخه زما دوه زده کونکو پدې وروستیو کې پدې موضوع کې د دوی د لیسانس درجې دفاع وکړه. د MS UI اتومات کولو ملاتړ کې لویه مرسته کړې او پدې وروستیو کې یې د متن ملکیتونو پراساس د "ریکارډ پلے بیک" اصولو پراساس د اتوماتیک کوډ جنریټر رامینځته کول پیل کړي (دا خورا پیچلي ځانګړتیا ده) ، تر دې دمه یوازې د "uia" پس منظر لپاره. د AT-SPI پر بنسټ د لینکس لپاره نوی پس منظر رامینځته کوي (ماډولونه mouse и keyboard اساس - دمخه په خپرونو کې 0.6.x).
له هغه وخته چې زه د څه مودې راهیسې په پایتون کې د اتوماتیک ځانګړي کورس درس ورکوم، د ماسټر ځینې زده کونکي د کور کار کوي، کوچني ځانګړتیاوې پلي کوي یا د اتوماتیک مثالونه. د څیړنې په مرحله کې ځینې مهم شیان هم یو ځل د زده کونکو لخوا کشف شوي. که څه هم ځینې وختونه تاسو باید د کوډ کیفیت په کلکه وڅارئ. جامد تحلیل کونکي (کوانټایډ کوډ ، کوډسي او منظره) او په کلاوډ کې اتومات ازموینې (AppVeyor خدمت) د شاوخوا 95٪ کوډ پوښښ سره پدې کې ډیره مرسته کوي.
همدارنګه د هرچا څخه مننه چې بیاکتنې پریږدي ، کیګونه راپورته کوي او د پلولو غوښتنې لیږي!
اضافي سرچینې
موږ د پوښتنو تعقیب کوو (په دې وروستیو کې څرګند شو ) او . دلته ده .
موږ هره میاشت تازه کوو . په GitHub کې د ستورو د شمیر له مخې، یوازې Autohotkey (دوی خورا لوی ټولنه او اوږد تاریخ لري) او PyAutoGUI په چټکۍ سره وده کوي (په لویه کچه د دې لیکوال ال سویګارټ لخوا د کتابونو شهرت له امله: "د بورینګ توکي اتومات کړئ. Python" او نور).
سرچینه: www.habr.com
