ไดรเวอร์ซีลีเนียมสำหรับแอปพลิเคชัน WinForms
ยินดีต้อนรับการมีส่วนร่วมใด ๆ :)
โครงการนี้ใช้
ทำไมต้องมีไดรเวอร์อื่นเมื่อมี https://github.com/microsoft/winappdriver อยู่แล้ว แอพที่ฉันทดสอบมีขนาดค่อนข้างใหญ่ด้วยองค์ประกอบหลายอย่างและไดรเวอร์นั้นกำลังกำหนดเวลาหลังจาก 60 วินาทีสำหรับการสืบค้น XPATH บางอย่าง (ดูปัญหานี้) และหลังจากนำทุกอย่างเข้าด้วยกันแบบสอบถามเสร็จภายใน 2 วินาที
โครงการนี้อาศัย MS UI Automation ซึ่งเป็นส่วนหนึ่งของ Windows Accessibility API
เอกสารอย่างเป็นทางการกล่าวถึงการสนับสนุนสำหรับแพลตฟอร์มต่าง ๆ :
UI Automation ได้รับการสนับสนุนในระบบปฏิบัติการต่อไปนี้: Windows XP, Windows Server 2003, Windows Server 2003 R2, Windows Vista, Windows 7, Windows 10, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016 และ Windows Server 2019
ฉันไม่สามารถยืนยันได้ว่ามันจะทำงานบนแพลตฟอร์มเหล่านั้นได้เนื่องจากฉันได้รับรางวัล 10 Enterprise บนเครื่องของฉัน แต่ห้องสมุดที่จำเป็นทั้งหมดเป็นส่วนหนึ่งของโครงการ
เท่าที่ฉันรู้ว่าโหมดนักพัฒนาไม่จำเป็น
ปัจจุบันไม่มีตัวติดตั้ง โคลนพื้นที่เก็บข้อมูลและสร้างการดำเนินการจากแหล่งที่มา ใช้งานที่พบได้ภายใต้ WinAppDriver.ServerbinDebugWinAppDriver.Server.exe
ไดรเวอร์ไคลเอนต์ล่าสุดเวอร์ชัน 3.141.0.0 ต้องใช้เมื่อโทรหาเซิร์ฟเวอร์
Ok และ Yes คำอธิบายเพิ่มเติมสามารถเพิ่มได้โดยการตั้งค่าความสามารถ acceptAlertButtonCaptions ด้วยรายการที่คั่นด้วยเครื่องหมายอัศDICOLON 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 - ID ของกระบวนการที่จะแนบไป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 ในแอปพลิเคชัน Win ไม่เหมือน Windows ในเบราว์เซอร์ windows ( ControlType.Window ) สามารถซ้อนกันภายในแผนผังควบคุมเช่นในองค์ประกอบ Tab
หน้าต่างสามารถอยู่ได้อย่างใดอย่างหนึ่งโดยใช้ xpath expression var window = session.FindElement(By.XPath("/Window/Pane/Window[@AutomationId='WindowName']")); หรือโดยการสลับไปที่ session.SwitchTo().Window("WindowName"); ในตัวอย่างแรกคุณจะได้รับการอ้างอิงองค์ประกอบในอีกบริบทภายในจะเปลี่ยนเป็นหน้าต่างใหม่และองค์ประกอบที่แคชในระหว่างการดำเนินการต่อไปนี้สามารถกำจัดได้เมื่อหน้าต่างถูก cloded session.Close()
โปรดทราบว่า wrappers องค์ประกอบเช่น OpenQA.Selenium.Support.UI.SelectElement ไม่ทำงานเนื่องจากคาดว่า select ภายในและองค์ประกอบ option
มีการแฮ็คที่น่าเกลียดซึ่งข้ามความจำเป็นในการสลับหน้าต่างเมื่อค้นหาหน้าต่างเด็กโดยใช้นิพจน์ XPath โดยค่าเริ่มต้นการค้นหาเริ่มต้นที่องค์ประกอบรูทของหน้าต่าง - หน้าต่างหลักหรือหน้าต่างที่ผู้ใช้เปลี่ยนเป็น - และการค้นหาหน้าต่างเด็กล้มเหลวเนื่องจากไม่ใช่ลูกโดยตรงของรูทปัจจุบัน การแก้ไขเริ่มต้นการค้นหาหน้าต่างที่ระดับบนสุด