سائق السيلينيوم لتطبيقات WinForms
أي مساهمات موضع ترحيب :)
هذا المشروع يستخدم
لماذا سائق آخر ، عندما يكون هناك بالفعل https://github.com/microsoft/winappdriver؟ التطبيق الذي أختبره كبيرًا جدًا مع العديد من العناصر ، وكان هذا السائق توقيته بعد 60 ثانية على بعض استعلامات Xpath (انظر هذه المشكلة) ، وبعد تجميع كل شيء معًا ، انتهى الاستعلام دون ثانيتين.
يعتمد هذا المشروع على أتمتة MS UI التي تعد جزءًا من واجهة برمجة تطبيقات Windows Accessible.
يذكر الوثائق الرسمية دعم المنصات المختلفة:
يتم دعم Automation UI على أنظمة التشغيل التالية: Windows XP و Windows Server 2003 و Windows Server 2003 R2 و Windows Vista و Windows 7 و Windows Server 2008 و Windows Server 2008 R2 و Windows Server 2012 و Windows Server 2012 R2 و Windows Server 2016 و Windows Server 2019.
لا يمكنني تأكيد أنها ستعمل على هذه المنصات لأنني فقط فوز 10 مؤسسة على الجهاز الخاص بي ، ولكن جميع المكتبات المطلوبة جزء من المشروع.
بقدر ما أعرف أن وضع المطور غير مطلوب.
حاليا ، لا يوجد تثبيت. استنساخ المستودع وبناء القابل للتنفيذ من المصادر. استخدم القابل للتنفيذ الموجود تحت WinAppDriver.ServerbinDebugWinAppDriver.Server.exe
يجب استخدام أحدث إصدار برنامج تشغيل العميل 3.141.0.0 عند الاتصال بالخادم.
Ok Yes ، يمكن إضافة تعليقات إضافية عن طريق تعيين إمكانية acceptAlertButtonCaptions Cancel No ، يمكن إضافة تعليقات إضافية عن طريق تعيين إمكانية dismissAlertButtonCaptions أوامر السيلينيوم غير المدعومة
دعم xpath:
//node[3] //node[@attribute = 'X'] يتم تنفيذ أمر Appium فقط
أضف إشارة إلى Selenium.WebDriver v3.141.0 (https://www.nuget.org/packages/selenium.webdriver/3.141.0) وأنت مستعد للذهاب.
يمكن للسائق إما بدء النظام ضمن عملية الاختبار أو إرفاقه بعملية تشغيل. استخدم القدرات لتحديد العملية التي يجب إرفاقها على.
عندما لا يتم توفير وسيطة سطر الأوامر ، سيتم إطلاق الخادم على عنوان IP الافتراضي http://127.0.0.1:4444 .
يتم دعم القدرات التالية:
mode - start (القيمة الافتراضية) أو attachprocessId - معرف العملية التي يجب إرفاقهاprocessName - اسم العملية التي يجب إرفاقها بـexePath أو app - المسار إلى القابل للتنفيذ لبدء العملية (لا يمكن توفير الوسائط في الوقت الحالي)appWorkingDir - قم بتعيين دليل العمل للعملية الجديدةmainWindowTitle - تعبير منتظم لمساعدة WinAppDriver على تضييق العملية التي يجب إرفاقها بـsendKeyStrategy ( oneByOne | grouped | setValue ) - استراتيجية لاستخدامها في كتابة النص في حقل نص ، والقيمة الافتراضية هي oneByOne ، حاليًا لا يمكن تغيير هذه الإمكانية أثناء الجلسة public static RemoteWebDriver CreateSessionByStartingTheApplication()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("app", "<name of the program to start>");
// or "exePath" desktopCapabilities.SetCapability("exePath", "<path to the executable to start the process>");
// following capabilities should be provided for UWP applications like Calculator or Clocks & Alarms
// optional - to set the working directory
desktopCapabilities.SetCapability("appWorkingDir", "<path to run the process in>");
// optional - to identify the process
desktopCapabilities.SetCapability("processName", "<name of the process>");
// optional - to identify the main window
desktopCapabilities.SetCapability("mainWindowTitle", "<name of the process>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
public static RemoteWebDriver CreateSessionByAttachingToRunningProcess()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("mode", "attach");
// attach to process using process name
desktopCapabilities.SetCapability("processName", "<name of the process to attach to>");
// with (optional)
desktopCapabilities.SetCapability("windowTitle", "<regular expression to narrow down the list of matching processes>");
// or attach to process using process id
desktopCapabilities.SetCapability("processId", "<id of the process to attach to>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
موقع العنصر الموصى به يستخدم تعبير XPath (على الرغم من دعم التعبير المحدود)
var webBrowser = session.FindElement(By.XPath("//Pane[@AutomationId='webBrowser']"));
آليات موقع العنصر المدعومة
TextBox#id Windows in the Win Application ليس مثل Windows في المتصفح. يمكن تداخل Windows ( ControlType.Window ) داخل شجرة التحكم ، على سبيل المثال في عنصر Tab .
يمكن أن تكون النافذة إما باستخدام Xpath Expression var window = session.FindElement(By.XPath("/Window/Pane/Window[@AutomationId='WindowName']")); أو عن طريق التبديل إلى It session.SwitchTo().Window("WindowName"); ، في المثال الأول ، ستحصل على مرجع العنصر ، في الآخر يتم تحويل السياق الداخلي إلى نافذة جديدة ويمكن التخلص من العناصر المخبأة أثناء العمليات التالية عندما تكون النافذة عبارة عن session.Close() .
لاحظ أن أغلفة العناصر مثل OpenQA.Selenium.Support.UI.SelectElement لا تعمل لأن عناصر select الداخلي option متوقع.
هناك اختراق قبيح تمامًا يتجاوز الحاجة إلى تبديل النوافذ عند البحث عن نافذة طفل باستخدام تعبير XPath. بشكل افتراضي ، يبدأ البحث في عنصر الجذر في النافذة - النافذة الرئيسية أو النافذة التي تحولها المستخدم إلى - وكان البحث عن نافذة طفل فشل لأنه لم يكن طفلًا مباشرًا للجذر الحالي. يبدأ الإصلاح البحث عن نافذة في المستوى العلوي.