Automation testing rất phong phú trong nhiều lĩnh vực như: Management Testing: quản lý việc phân tích, kiểm tra giám sát quy trình sản xuất, vòng đời và chất lượng sản phẩm; Automated So
Giới thiệu
Tổng quan
Kiểm tra thủ công (manual testing) là hoạt động của con người trước máy tính cẩn thận thực hiện kiểm tra từng bước một Tự động hóa kiểm tra (automated testing) có nghĩa là dùng công cụ tự động để thực hiện công việc kiểm tra, kiểm định Phần mềm tự động có thể nhập dữ liệu kiểm tra, chạy các bước theo quy trình, so sánh kết quả thực tế với kết quả dự kiến và phát sinh ra báo cáo kiểm định
Kiểm tra yêu cầu việc đầu tư đáng kể tiền bạc và nguồn nhân lực Dùng công cụ kiểm tra tự động có thể ghi nhận lại quá trình kiểm tra và chạy lại nếu có yêu cầu
Một khi việc kiểm tra được tự động hóa, không cần có sự can thiệp của con người
Tại sao dùng test automation:
• Kiểm tra thủ công tốn thời gian, chi phí và nguồn lực
• Khó khăn để kiểm tra nhiều ứng dụng một lúc thủ công
• Tự động không yêu cầu sự can thiệp của con người, có thể chạy bất cứ lúc nào (chạy qua đêm chẳng hạn)
• Kiểm tra tự động tăng tốc độ kiểm tra ứng dụng, tăng phạm vi kiểm tra
• Kiểm tra thủ công có thể dẫn đến sự lặp lại nhàm chán và phát sinh lỗi
Các trường hợp có thể kiểm tra tự động:
• Các trường hợp kiểm tra có tính lặp lại
• Các trường hợp kiểm tra khó thực hiện thủ công hoặc rất chán ngắt cho con người
• Các trường hợp kiểm tra tiêu tốn quá nhiều thời gian
Các trường hợp không thích hợp cho việc kiểm tra tự động:
• Các công việc mới và chưa thực hiện thủ công ít nhất một lần
• Các công việc yêu cầu thay đổi thường xuyên
Các lợi ích của việc kiểm tra tự động:
• Nhanh hơn kiểm tra thủ công rất nhiều lần
• Kết quả đáng tin cậy
• Kết quả đảm bảo tính nhất quán
• Tiết kiệm thời gian và tiền bạc
• Đảm bảo sự chính xác cao
• Không cần sự can thiệp của con người
• Các kịch bản kiểm tra có thể sử dụng lại
• Có thể kiểm tra một cách thường xuyên.
Mục đích nghiên cứu đề tài
Có nhiều ứng dụng test automation hiện nay trên thị trường rất mạnh và nhiều tính năng phong phú Tuy nhiên, các phần mềm này có thu phí bản quyền hàng năm và chi phí sử dụng rất đắt Mục đích nghiên cứu của đề tài là xây dựng ứng dụng test automation đơn giản nhưng hiệu quả Đáp ứng yêu cầu cơ bản của một hệ thống tự động kiểm định, kiểm tra nhưng phần mã nguồn mở, công khai cho mọi người Có thể dựa vào nghiên cứu và sử dụng mã nguồn này để từ đó phát triển thêm, tạo nên một hệ thống hoàn thiện sau này
Có nhiều loại test automation khác nhau trong nhiều lĩnh vực khác nhau Mục đích nghiên cứu của đề tài là xây dựng một hệ thống test automation trên ứng dụng
• Phần bắt các UI Element (User Interface Element) trên ứng dụng test một cách chính xác, kết hợp với một số lệnh để tương tác với Element này tạo thành một kịch bản (script) để tùy biến thực hiện nhiều việc khác nhau, kết hợp với lệnh điều kiện If tùy theo giá trị thực tế trả về như thế nào sẽ có hành động khác nhau phù hợp Script là ngôn ngữ được thể hiện với những câu lệnh đơn giản và lưu ở định dạng văn bản dễ đọc Ví dụ test automation trên web: tự động điền username, điền password và nhấn nút đăng nhập trên một website Tùy theo giá trị trả về là đăng nhập thành công hay thất bại ta sẽ có các bước tiếp theo khác nhau
• Phần biên dịch, đọc và phân tích các lệnh từ file script Trình biên dịch thực hiện chức năng phân tích từ vựng và phân tích cấu trúc ngữ pháp của từng dòng lệnh, từ đó chạy các dòng lệnh trong file scrip theo nội dung yêu cầu Đồng thời cũng có hệ thống logs ghi nhận lại các bước chạy thành công hoặc thất bại để người sử dụng kiểm tra và xử lý
1.2.2 Tính năng Đề tài phát triển một hệ thống tự động kiểm định (test automation) có các tính năng như sau:
• Xác định và highlight các thành phần UI (UI Element) theo vị trí và kích thước trên ứng dụng cần test
• Xác định được tất cả các đặc tính (Properties) của mỗi thành phần UI Elelement, sử dụng kết hợp một trong số những đặc tính này để xác định duy nhất một giá trị ID đại diện cho UI Element này
• Xây dựng các UI Element theo cấu trúc cây phân nhánh với gốc là desktop và các nhánh con là các UI Element thành phần
• Cơ chế tìm kiếm UI Element dựa theo chuỗi ID đã xác định từ gốc ứng dụng xuống các nhánh con nhanh và chính xác
• Ghi nhận tương tác người sử dụng đối với các UI Element trên ứng dụng cần test theo 2 chế độ manual và tự động để lưu vào script
• Thực hiện được Invoke (click) đối với các UI Element có ControlType là button, lấy giá trị và đặt giá trị cho các ControlType là dạng text
• Xây dựng được một trình biên dịch gồm có phần phân tích từ vựng, phân tích cú pháp với cấu trúc lệnh rẽ nhánh có điều kiện If, kết hợp với một số lệnh tương tác cơ bản với UI Element
• Có hệ thống logs để lưu lại quá trình biên dịch nhằm mục đích kiểm tra và xác định lỗi
1.2.3 Độ phức tạp Để xây dựng một hệ thống test automation hoàn chỉnh, yêu cầu nhận diện, xác định và tương tác được tất cả các kiểu điều khiển (Control Pattern) của các thành phần UI Element như bảng 2.1
Phần trình biên dịch yêu cầu nhiều lệnh khác nhau để tương tác với mỗi UI Element khác nhau, cùng với nhiều lựa chọn và xuất kết quả báo cáo
Có một hệ thống báo cáo hoàn chỉnh, chi tiết để hỗ trợ người sử dụng
Hiện đề tài chỉ hỗ trợ kiểu điều khiển (Control Pattern) là InvokePattern và TextPattern Có thể mở rộng cho tất cả các kiểu điều khiển trong bảng 2.1
Mở rộng thêm nhiều lệnh cho trình biên dịch, cũng như các lệnh tùy chọn và xuất báo cáo
Mở rộng xây dựng một hệ thống báo cáo chuyên nghiệp hơn, hiệu quả, thân thiện với người sử dụng
1.2.5 Ứng dụng Ứng dụng cụ thể của đề tài trong việc kiểm định đo thời gian quay số kết nối giữa client và server trong hệ thống tổng đài Voice IP Hệ thống sẽ tự động chạy ứng dụng softphone trên Windows, quay số kết nối đến tổng đài và chờ đến khi kết nối thành công hoặc thất bại trong khoảng thời gian cho phép Việc kiểm tra tự động được thực hiện trên rất nhiều số điện thoại khác nhau sẽ tiết kiệm rất nhiều thời gian so với thao tác bằng tay, đây cũng là một ví dụ ứng dụng thực tế của hệ thống test automation
Mở rộng việc ứng dụng hệ thống test automation cho nhiều mục đích khác nhau như tự động hóa kiểm định sản phẩm phần mềm, tự động hóa các chương trình ứng dụng trên Windows, các ứng dụng hỗ trợ người dùng, …
Phạm vi nghiên cứu và phương pháp nghiên cứu
Giới hạn đối với các ứng dụng chạy trên môi trường Windows nền tảng WinForm, Dot Net và Windows Presentation Foundation (WPF)
Giới hạn thao tác đối với các điều khiển Control Type dạng nút nhấn (Button) và trường Edit box dạng text Đối với trình biên dịch, xây dựng một số lệnh cơ bản để tương tác với ứng dụng cần test như: RunApp, GetID, PushID, WaitID, SetID, ShowID và lệnh điều kiện rẽ nhánh If
Dùng công cụ lập trình Visual C# trong bộ Microsoft Visual Studio 2015, chỉ sử dụng các thư việc sẵn có của Microsoft Ứng dụng chạy yêu cầu máy tính cài Net Framework 4.0 trở lên (tất cả các máy sử dụng hệ điều hành Windows 7 trở đi đều được cài sẵn) Đề tài được phát triển bởi tham khảo các tài liệu nghiên cứu, các sách kỹ thuật liên quan được giới thiệu trong phần tài liệu tham khảo; diễn đàn cho các nhà phát triển ứng dụng của công ty Microsoft.
Lý thuyết tổng quan và tình hình nghiên cứu
Giới thiệu công nghệ Automation trên Windows
Công nghệ User Interface Automation (UIA) kế thừa MS Active Accessibility (MSAA) của Microsoft, cung cấp các truy cập có thể lập trình đến tất cả các thành phần giao diện người dùng (User Interface element – UI element) trên desktop, nhằm mục đích hỗ trợ người sử dụng (assistive) và tự động hóa kiểm tra (test automation)
Hỗ trợ các ứng dụng được viết trên nền WPF, WinForm, ASP.NET, Win32, trong đó WPF mặc định hỗ trợ UIA
Công cụ hỗ trợ (assistive tool) như công cụ đọc màn hình có thể thông báo cho người dùng (ví dụ như một cửa sổ được mở) hoặc công cụ kiểm tra (automation tool) có thể dùng UIA để chạy và chờ đến khi kết thúc một loạt thao tác được ghi nhận của người sử dụng
Các thành phần giao diện người dùng (User Interface - UI) có thể được xem như một cấu trúc cây với desktop là gốc, cửa sổ ứng dụng là nhánh trực tiếp, các thành phần của ứng dụng là các nhánh con, mỗi một thành phần được gọi là UI Element hay Automation Element (AE) UI Element hỗ trợ pattern, các pattern khác nhau với các cấu trúc điều khiển khác nhau Ví dụ: nút (button) có invoke pattern, tương đương với click trên nút đó Các edit boxes có value pattern, có thể đặt giá trị cho chúng
UIA cung cấp cách để tìm kiếm trên cây để xác định các nhánh dựa trên các điều kiện cung cấp Ví dụ như tìm một UI Element từ gốc cây (desktop) hoặc từ của sổ ứng dụng đang chạy UIA cũng hỗ trợ thông báo đến người dùng với các Events (sự kiện) nếu có thao tác tác động lên các Element này
Năm 2005, Microsoft phát hành UIA như là một kế thừa MSAA Các API UI Automation đã được phát hành như là một phần của NET Framework 3.0, được bao gồm như là một phần của Windows Vista, Windows 7, và Windows Server 2008 SDK
2.1.2 Động lực và mục tiêu
Là một kế thừa của MSAA, UIA nhằm giải quyết các mục tiêu sau đây:
• Tạo sự hiệu quả cho các ứng dụng bên ngoài mà không cần móc (hook) vào các tiến trình của một ứng dụng đích
• Đưa ra thêm nhiều thông tin về các giao diện người dùng
• Cùng tồn tại và sử dụng với MSAA, nhưng không kế thừa những vấn đề tồn tại trong MSAA
• Cung cấp một thay thế cho MSAA nhưng đơn giản hơn để thực hiện triển khai
2.1.3 Kỹ thuật tổng quan Ở phía client, UIA cung cấp một giao diện NET trong UIAutomationClient.dll và một giao diện triển khai trực tiếp trong UIAutomationCore.dll Ở phía server, UIAutomationCore.dll được gắn vào tất cả hoặc một số tiến trình lựa chọn trên desktop để thực lấy dữ liệu theo yêu cầu của phía client Các DLL cũng có thể tải các UIA plugins (gọi là providers) vào tiến trình chủ của nó để trích xuất dữ liệu sử dụng các kỹ thuật khác nhau Sơ đồ tổng quát được mô tả ở hình 2.1 và ý nghĩa của các thành phần được trình bày ở bảng 2.1
Hình 2.1: Mô hình kỹ thuật tổng quan UIA
UIA có 4 providers chính và các thành phần client, bao gồm:
Các thành phần Mô tả
Các mã nền tảng (đôi khi được gọi là lõi UIA) để xử lý thông tin liên lạc giữa các providers và clients UI Automation Core cũng cung cấp các giao diện API provider và client cho các ứng dụng unmanaged client (ứng dụng viết trên nền C++); các ứng dụng unmanaged (client hoặc provider) không yêu cầu các thư viện được liệt kê dưới đây
Managed Provider API (UIAutomationProvider.dll)
Một tập hợp các định nghĩa giao diện và chức năng được thực hiện bởi các ứng dụng managed UIA (ứng dụng được viết trên nền C# và VB.NET) Providers là các đối
Các thành phần Mô tả tượng cung cấp thông tin về thành phần giao diện người dùng và đáp ứng với lập trình đầu vào
Managed Client API (UIAutomationClient.dll)
Một tập hợp các định nghĩa giao diện và các hàm cho các ứng dụng managed client UIA
UIAutomationClientsideProviders.dll Một tập hợp các UIA providers cho điều khiển Win32 cũ và các ứng dụng MSAA
Provider về phía client này hiện có sẵn cho các ứng dụng managed client theo mặc định
Bảng 2.1: Các thành phần của UIA
UIA cho thấy tất cả các mảnh của giao diện người dùng cho các ứng dụng khách (client application) như là một phần tử tự động hóa AE (Automation Element)
Các thành phần này được chứa trong một cấu trúc cây, với desktop như là phần tử gốc của cây
Automation Element phơi bày ra các đặc tính (properties) của thành phần UI mà chúng đại diện Một trong những đặc tính là các loại điều khiển (control types), trong đó xác định sự thể hiện cơ bản của nó và các chức năng như một thực thể nhận biết duy nhất (ví dụ, một nút (button) hoặc hộp kiểm tra (check box))
Ngoài ra, các thành phần này phơi bày các kiểu điều khiển (control patterns) cung cấp các đặc tính (properties) cụ thể với các loại điều khiển của chúng Kiểu điều khiển cũng phơi bày các phương pháp cho phép ứng dụng khách lấy thêm thông tin về các yếu tố và cung cấp đầu vào Hình 2.2 trình bày ứng dụng Calculator của
Windows cùng với một số kiểu điều khiển (Control Type) khác nhau của nó Ứng dụng khách có thể lọc xem dữ liệu của cây theo kiểu điều khiển hoặc xem kiểu nội dung Ứng dụng cũng có thể tạo các kiểu xem tùy chỉnh
Hình 2.2: Mô tả một cửa sổ ứng dụng cơ bản và một số UI Element của nó
Trong cây UIA có một thành phần gốc đại diện cho dektop hiện thời và các thành phần con đại diện cho các cửa sổ ứng dụng Mỗi thành phần con có thể chứa các thành phần đại diện cho phần của giao diện người dùng như menu, các nút, thanh công cụ, và các hộp tùy chọn Những thành phần này, đến lượt nó, có thể chứa các thành phần khác, chẳng hạn như danh sách các mục
Cây UIA không phải là một cấu trúc cố định và ít khi được nhìn thấy trong toàn bộ của nó bởi vì nó có thể chứa hàng ngàn thành phần khác Các bộ phận của cây được xây dựng khi cần thiết, và cây có thể có những thay đổi như các thành phần được thêm vào, di chuyển, hoặc xóa bỏ Ví dụ hình 2.3 vẽ một cây với gốc là desktop, có 3 nhánh con là các ứng dụng 1, ứng dụng 2 và ứng dụng 3 Trong ứng dụng 1 có các UI Element là các nhánh con tạo nên một cấu trúc cây
Hình 2.3: Mô hình cây UI Elements với gốc cây (root) là Desktop
2.1.6 Loại điều khiển (Control Types)
Các loại điều khiển UIA là những định danh đã biết có thể được sử dụng để chỉ những loại điều khiển một thành phần cụ thể đại diện, chẳng hạn như một hộp combo (combo box) hoặc một nút (button)
Giới thiệu công nghệ Automation trên Web
Rất nhiều phần mềm ứng dụng ngày nay được viết như các ứng dụng dựa trên web để chạy trong một trình duyệt Internet Hiệu quả của việc thử nghiệm các ứng dụng này rất khác nhau giữa các công ty và tổ chức
Trong một thời đại của các quá trình phần mềm tương tác và đáp ứng cao, test automation thường xuyên trở thành một yêu cầu cho các dự án phần mềm, kiểm tra tự động hóa thường là câu trả lời Kiểm tra tự động có nghĩa là sử dụng một công cụ phần mềm để chạy thử nghiệm lặp lại đối với các ứng dụng được thử nghiệm
Có rất nhiều lợi thế để kiểm thử tự động Hầu hết đều liên quan đến việc lặp lại của các bài kiểm tra và tốc độ mà tại đó các bài kiểm tra có thể được thực thi Có một số công cụ mã nguồn mở và thương mại sẵn sàng cho việc hỗ trợ sự phát triển của kiểm thử tự động Selenium có thể là giải pháp mã nguồn mở được dùng nhiều nhất
Kiểm tra tự động hóa có lợi thế rất lớn để nâng cao hiệu quả lâu dài của quá trình thử nghiệm của một đội ngũ kiểm tra phần mềm Kiểm tra tự động hỗ trợ:
• Kiểm tra lặp lại thường xuyên
• Thông tin phản hồi nhanh chóng đến nhà phát triển
• Lặp đi lặp lại hầu như không giới hạn các trường hợp thực hiện kiểm tra
• Báo cáo các khiếm khuyết được tùy chỉnh
• Tìm các khuyết tật bị bỏ qua bởi các kiểm tra thủ công
2.2.1 Tự động hóa hay không?
Tự động hóa luôn luôn có lợi thế? Khi nào ta nên quyết định tự động hóa?
Không phải là luôn luôn thuận lợi để tự động hóa trong các trường hợp thử nghiệm Có nhiều trường hợp khi kiểm tra thủ có thể thích hợp hơn Ví dụ, nếu giao diện người dùng của ứng dụng sẽ thay đổi đáng kể trong tương lai gần, khi đó bất kỳ tự động hóa có thể cần phải được viết lại Ngoài ra, đôi khi đơn giản là không đủ thời gian để xây dựng tự động hóa kiểm tra Trong ngắn hạn, kiểm tra thủ công có thể có hiệu quả hơn Nếu một ứng dụng có thời hạn chót rất chặt chẽ, hiện nay không có thử nghiệm tự động có sẵn, và nó bắt buộc rằng các thử nghiệm được thực hiện trong một khoảng thời gian đó, thì khi đó kiểm tra thủ công là giải pháp tốt nhất
Selenium là một tập hợp các công cụ phần mềm khác nhau với cách tiếp cận khác nhau để hỗ trợ kiểm thử tự động Hầu hết các kỹ sư đảm bảo chất lượng (QA Engineers) của Selenium tập trung vào một hoặc hai công cụ mà hầu hết đáp ứng nhu cầu của các dự án của họ, tuy nhiên việc học tất cả các công cụ này sẽ cung cấp cho bạn nhiều lựa chọn khác nhau để tiếp cận vấn đề tự động hóa thử nghiệm khác nhau
Toàn bộ bộ công cụ tập hợp phong phú các chức năng kiểm tra thiết kế riêng cho nhu cầu của các thử nghiệm của ứng dụng web của tất cả các loại Những hoạt động linh hoạt, cho phép nhiều tùy chọn để định vị các thành phần giao diện người dùng và so sánh kết quả kiểm tra dự kiến đối với hành vi ứng dụng thực tế Một trong những tính năng chính của Selenium là sự hỗ trợ để thực hiện các bài kiểm tra của một người trên nhiều nền tảng trình duyệt khác nhau
Selenium bao gồm nhiều công cụ phần mềm Mỗi cái có một vai trò cụ thể.
Selenium 2 (Selenium WebDriver)
Selenium 2 là định hướng tương lai của dự án và sự bổ sung mới nhất cho bộ công cụ Selenium Thương hiệu công cụ tự động hóa mới này cung cấp tất cả các loại tính năng tuyệt vời, bao gồm các API kết hợp và hướng đối tượng cũng như một câu trả lời cho những hạn chế của việc phiên bản cũ
Cả Selenium và nhà phát triển WebDriver đồng ý rằng cả hai công cụ đều có những ưu và rằng việc sáp nhập hai dự án này sẽ tạo ra một công cụ tự động hóa nhiều mạnh mẽ hơn
Selenium 2.0 là sản phẩm của nỗ lực đó Nó hỗ trợ các API WebDriver và các công nghệ nền tảng, cùng với công nghệ Selenium 1 bên dưới API WebDriver cho sự linh hoạt tối đa trong các thử nghiệm Ngoài ra, Selenium 2 vẫn chạy giao diện Selenium RC của Selenium 1 đối với vấn đề tương thích ngược.
Selenium 1 (Selenium RC hoặc Remote Control)
Selenium RC là dự án Selenium chính trong một thời gian dài, trước khi WebDriver/Selenium hợp nhất đưa lên Selenium 2, các công cụ mới nhất và mạnh mẽ hơn
Bây giờ Selenium 1 không còn được hỗ trợ tích cực (chủ yếu trong chế độ bảo trì).
Selenium IDE
Selenium IDE (Môi trường phát triển tích hợp) là một công cụ tạo mẫu để xây dựng kịch bản thử nghiệm Nó là một plugin của Firefox và cung cấp một giao diện dễ sử dụng cho việc phát triển các bài kiểm tra tự động Selenium IDE có một tính năng ghi lại hành động của người dùng khi họ đang thực hiện và sau đó xuất chúng như là một kịch bản tái sử dụng trong một trong nhiều ngôn ngữ lập trình mà có thể được thực thi sau này.
Selenium Grid
Selenium Grid cho phép các giải pháp Selenium RC mở rộng cho các thử nghiệm lớn và dãy thử nghiệm phải được chạy trong nhiều môi trường Selenium Grid cho phép chạy các bài kiểm tra song song, có nghĩa là, các bài kiểm tra khác nhau có thể chạy cùng lúc trên máy từ xa khác nhau Điều này có hai lợi thế Đầu tiên, nếu bạn có một bộ thử nghiệm lớn, hoặc một bộ thử nghiệm chạy chậm, bạn có thể tăng hiệu quả của nó đáng kể bằng cách sử dụng Selenium Grid để chia bộ kiểm tra của bạn để chạy thử nghiệm khác nhau tại cùng một thời gian sử dụng các loại máy khác nhau Ngoài ra, nếu bạn phải chạy bộ kiểm tra của bạn trên nhiều môi trường mà bạn có thể có các máy từ xa khác nhau hỗ trợ và chạy thử nghiệm của bạn trong họ cùng một lúc Trong mỗi trường hợp Selenium Grid cải thiện đáng kể thời gian cần để chạy bằng cách sử dụng xử lý song song
Trong Selenium 2.0, các trình duyệt được hỗ trợ khác nhau tùy thuộc vào việc bạn đang sử dụng Selenium WebDriver hoặc Selenium RC
Selenium WebDriver hỗ trợ các trình duyệt sau cùng với các hệ điều hành mà các trình duyệt này tương thích:
• Internet Explorer 7, 8, 9, 10, và 11 trên hệ điều hành Vista, Windows 7, Windows 8 và Windows 10 Tính đến ngày 15/4/2014, IE 6 không còn được hỗ trợ Hỗ trợ chạy các phiên bản 32-bit và 64-bit của trình duyệt
• Firefox: ESR mới nhất, trước ESR, phiên bản hiện tại, một trong những phiên bản trước đó
• Android (với Selendroid hoặc appium)
• iOS (với ios-driver hoặc appium) Selenium 1.0 và Selenium-RC: hỗ trợ các trình duyệt cũ với tính năng hạn chế.
Test case
Ví dụ sau tạo một project dùng công cụ Selenium WebDriver, dùng các hàm
API có sẵn của công cụ này để thực hiện các công việc sau một cách tự động:
• Truy cập vào trang cổng thông tin đào tạo sau đại học của trường Đại học
Bách Khoa TP.HCM (link là http://www.grad.hcmut.edu.vn/hv/login.php), hình 2.5:
Hình 2.5: Màn hình đăng nhập dùng Selenium WebDriver
• Lấy giá trị tên học viên và ngành học bằng cách xác định giá trị của các element tương ứng (Hình 2.6) Toàn bộ công việc được thực hiện một cách tự động, từ bước điền tên đăng nhập, mật khẩu đến lấy giá trị tên và ngành học lưu vào các biến, người dùng không cần thực hiện một thao tác nào
Hình 2.6: Lấy các Element dùng Selenium WebDriver
Cách thực hiện
Khác với các hệ thống test automation trên Windows, trên nền web ta xác định các Element dựa theo các thuộc tính của Document Object Model (DOM) như ID,
Xpath, CssStyle… Ví dụ ở hình 2.7, dùng addon FirePath trên trình duyệt Firefox, ta xác định Element tên học viên có chuỗi ID là: //*[@id='header_col3']/div[1]/b
Hình 2.7: Xác định Element trên trình duyệt Để tích hợp công cụ Selenium WebDriver, đầu tiên tạo một new project tên Selenium, chuột phải vào project chọn “Manage Nuget Packages for Solution…”, chọn và cài gói Selenium.WebDriver như hình 2.8
Hình 2.8: Add Selenium WebDriver vào ứng dụng
Add các references sau, chọn WebDriver là trình duyệt Firefox: using OpenQA.Selenium.Firefox; using OpenQA.Selenium;
Viết các dòng code như sau: private void button1_Click(object sender, EventArgs e) {
//Tạo một WebDriver Firefox driver.Navigate().GoToUrl("http://www.grad.hcmut.edu.vn/hv/login.php");
//Duyệt đến trang http://www.grad.hcmut.edu.vn/hv/login.php driver.FindElement(By.Id("usrname")).SendKeys("UserName");
//Tìm element có Id là “usrname” và điền giá trị //“UserName” driver.FindElement(By.Id("pass_input")).SendKeys("PassWord") //Tìm element có Id là “pass_input” và điền giá trị //“PassWord” driver.FindElement(By.Id("btnGo")).Click();
//Click vào nút đăng nhập, là element có Id là “btnGo”
IWebElement tenhv = driver.FindElement(By.CssSelector("b"));
//Tìm element tên học viên theo CssStyle có giá trị là “b”
IWebElement nganh = driver.FindElement(By.XPath("//div[@id='header_col3']/div[1]/b"));
//Tìm element ngành học theo Xpath có giá trị là //”//div[@id='header_col3']/div[2]/b”
MessageBox.Show("Tên học viên: " + tenhv.Text + "\r\n" + "Ngành: " + nganh.Text);
Kết quả
Kết quả như hình 2.9 Nhận xét: với công cụ Selenium WebDriver, ta có thể thực hiện việc tự động hóa trên Web theo nhiều yêu cầu và mục đích khác nhau Như trường hợp trên là một ví dụ đơn giản của việc trích xuất thông tin, thực hiện thu thập thông tin theo yêu cầu Đối với các thông tin thường xuyên thay đổi, ta có thể thực hiện công việc trên theo định kỳ và báo cáo tự động, tiết kiệm được rất nhiều thời gian và công sức
Hình 2.9: Kết quả thực tế dùng Selenium WebDriver
Test Case
Tương tự như phần 2.2.5 Việc xác định các Element cũng thực hiện tương tự
Cài đặt, dùng addon WebDriver IDE trong trình duyệt Firefox để xác định các element và ghi nhận lại thao tác thành file script Sau đó chạy lại để thực hiện các lệnh đã lưu File Script có dạng như sau: open http://www.grad.hcmut.edu.vn/hv/login.php // Truy cập trang web http://www.grad.hcmut.edu.vn/hv/login.php type id=usrname 123456789
// Gõ password 123456789 vào trường element xác định bởi id là “usrname” type id=pass_input abc123
// Gõ password abc123 vào trường element xác định bởi id là “pass_input” clickAndWait id=btnGo // Click vào nút đăng nhập có id là “btnGo” storeText css=b ten // Lấy giá trị của element tên học viên, xác định bởi CssStyle là “b”, lưu // vào biến ten storeText //div[@id='header_col3']/div[2]/b nganh
// Lấy giá trị của element ngành học, xác định bởi Xpath // là “//div[@id='header_col3']/div[2]/b”, lưu vào biến nganh echo ${ten}
// Hiện giá trị biến tên đã lưu echo ${nganh}
// Hiện giá trị biến ngành đã lưu
Kết quả chạy script dùng công cụ Selenium IDE như hình 2.10 Script này có thể lưu lại và chạy nhiều lần
Hình 2.10: Kết quả thực tế dùng Selenium IDE
2.3 Giới thiệu và so sánh về các hệ thống testing trong nhiều lĩnh vực khác nhau trên thế giới hiện nay Ở Việt Nam, các hệ thống testing chưa thực sự phát triển, chưa có nhiều nghiên cứu về vấn đề này Tuy nhiên, trên thế giới có rất nhiều bộ công cụ thực hiện việc automated testing trong rất nhiều mảng khác nhau
• Test Management Tools: mô phỏng quản lý việc phân tích, kiểm tra giám sát quy trình sản xuất, vòng đời sản phẩm, thông tin các thành phần, chất lượng sản phẩm, … cho đến khi phát hành hoặc xuất xưởng Các hệ thống test management nổi tiếng bao gồm: HP Quality Centre (QC), HP Application Lifecycle Management (ALM), Tricentis TOSCA, IBM Rational Quality Manager, Microsoft Team Foundation Server (TFS), Silk
Test Manager, T-Plan, Atlassian JIRA
• Automated Testing Tools: gồm các hệ thống tự động kiểm tra, kiểm định theo quy trình được lập trình trước trên nhiều nền tảng khác nhau như Windows, Web, iOS, Android, … Các hệ thống phần mềm lớn rất nổi tiếng như: HP Unified Functional Tester (UFT), HP Quick Test Professional (QTP), HP Service Test, HP Service Virtualisation, Tricentis TOSCA, IBM Rational Functional Tester (RFT), Selenium, Cucumber, Ruby, JUnit, JBehave, WATIR, SOAP UI, Test Complete, SILK Test,
• Performance Testing Tools: dùng để kiểm tra khả năng vận hành, đáp ứng của hệ thống Ví dụ như: HP Performance Centre, HP LoadRunner, Facilita Forecast, HP SiteScope, Apache JMeter, CA (ITKO) LISA, IBM Rational Performance Tester, Microsoft Visual Studio, YourKit, Silk Performer Workbench, WebDriver, Compuware dynaTrace, Quest JProbe, Java
• Security Testing Tools: tự động dò tìm, kiểm tra, phát hiện các lỗ hổng bảo mật của một hệ thống; hay website của công ty, tổ chức và cơ quan chính phủ Mục đích đánh giá khả năng bảo mật của hệ thống, đề phòng, ngăn chặn trước các cuộc tấn công có thể xảy ra Tiêu biểu như: Fortify, Tipping Point, ArcSight, Metasploit, w3af, Core Impact, BeFF, Nessus, OpenVAS, Nexpose, Burp, Nikto, WebScarab, Webinspect
Nhận xét, đánh giá một số chương trình automated testing hiện nay:
Có rất nhiều hệ thống automated software testing, bao gồm cả thương mại và mã nguồn mở Hiện nay có hai bộ phần mềm rất nổi tiếng là HP Quick Test Pro (QTP) hay HP Unified Functional Testing (UFT) và Selenium chiếm phần lớn thị phần trong lĩnh vực này
HP UFT (http://www8.hp.com/us/en/software-solutions/unified-functional- automated-testing/index.html) là phần mềm thương mại của công ty HP (Hewlett- Packard), Selenium là phần mềm mã nguồn mở (http://www.seleniumhq.org) do một nhóm các nhà nghiên cứu phát triển
2.3.1 HP Quick Test Professional (QTP)
HP là công ty phần mềm hàng đầu trên thị trường về công cụ test automation
HP QTP hoạt động với hầu hết ứng dụng Windows và nền tảng web Sản phẩm mới nhất là UFT (Unified Functional Testing) đồng thời hỗ trợ cả ứng dụng di động Điểm cộng
• Ngôn ngữ chính là VB script và các công cụ được đóng gói với nhiều tính năng Các công ty, tổ chức không cần phải có một lập trình viên có kỹ năng để viết một kịch bản tự động hóa cơ bản Các phần mở rộng (add-ons) liên quan của nó cung cấp rất nhiều sự linh hoạt và sức mạnh để kiểm định tự động các dịch vụ web và dịch vụ ảo hóa
• QTP có một kho đối tượng lớn để phục vụ cho việc kiểm định tự động hóa các thành phần theo định hướng đối tượng Công cụ này là lúc tốt nhất khi đề cập đến việc duyệt, kiểm định kết quả và báo cáo… Các công ty, tổ chức không cần lo lắng về việc tích hợp của QTP với các thành phần hỗ trợ khác
• Một lợi thế lớn là QTP có nhiều loại và mức độ hỗ trợ khác nhau mà khách hàng sẽ nhận được trong trường hợp họ gặp vấn đề kỹ thuật Sẽ luôn luôn có một đội ngũ tư vấn cho khách hàng các dịch vụ và giải pháp khi họ yêu cầu Điểm trừ
• QTP cực kỳ tốn kém khi so sánh nó với bất kỳ công cụ mã nguồn mở hoặc công cụ thương mại nào khác Chi phí bản quyền là hoàn toàn phụ thuộc vào khối lượng và loại giấy phép, cũng như các nếu khách hàng muốn có thêm các phần mở rộng tích hợp khác
• Chi phí bản quyền không được thực hiện mua một lần mà phát sinh trải dài qua rất nhiều năm Đến từ các ứng dụng sẽ luôn luôn phát triển sau một khoảng thời gian với các tính năng và công nghệ đáp mới ứng nhu cầu của một thị trường cạnh tranh Do đó, các công ty khách hàng cần tiếp tục chi tiêu để nâng cấp QTP cho các tính năng mới hỗ trợ công nghệ mới
• QTP chủ yếu phục vụ môi trường Windows và hỗ trợ số lượng hạn chế trình duyệt
Selenium là công cụ mã nguồn mở dành cho việc test các ứng dụng nền tảng web thông qua web browser Điểm cộng
Cấu trúc giải thuật chương trình và kết quả thực hiện
Giới thiệu giao diện
Hình 3.1 giới thiệu giao diện chính của chương trình:
Hình 3.1: Giao diện chương trình
• Start/Stop: ghi nhận/dừng các thao tác trên ứng dụng test
• Save: chọn đường dẫn để xuất danh sách các thao tác trong phần Code ra script file để lưu lại
• Load: chọn đường dẫn để tải file script đã lưu
Hình 3.2: Giao diện tab UI Elements
Hình 3.2 gồm có các thành phần:
➢ Cây Elements (Element Tree): hiển thị các UI Elements dạng cấu trúc cây với gốc là desktop, các UI Element thành phần là các nhánh con (Hình 3.3)
Hình 3.3: Cấu trúc cây Element của ứng dụng Calculator
➢ ListView: danh sách các giá trị UI Element tương ứng Gồm có các thành phần như sau (Hình 3.4):
• ID: chuỗi xác định một UI Element được hash bằng hàm CRC32 Ví dụ:
Chuỗi CalFrame|CalFrame|150Static được biễu diễn bởi chuỗi
6d3a34f8|6d3a34f8|8ca3b4c4 với các giá trị tuần tự được phân biệt bởi ký tự “|” theo sơ đồ cây UI Element Giá trị đầu tiên là UI Element gốc của cây, các giá trị sau là các UI Element nhánh con tương ứng, giá trị cuối cùng chính là UI Element cần xác định Mỗi UI Element được xác định từ 2 Proerties là AutomationId + ClassName như hình:
Hình 3.4: Chuỗi ID xác định một UI Element
AutomationId + ClassName = 150Static -> hash CRC32 -> 8ca3b4c4
- Chọn hàm hash CRC32 để rút ngắn giá trị của chuỗi, bởi vì hàm CRC32 cho ra giá trị chuỗi hash không đổi có chiều dài 8 bytes
- Bằng cách lưu giá trị của UI Element cần xác định theo giá trị chuỗi các UI Element thành phần từ trên xuống, theo sơ đồ cây làm tăng tốc đáng kể việc tìm kiếm UI Element cần tìm trong một ứng dụng có rất nhiều UI Element dẫn đến cây UI Element có nhiều nhánh phức tạp
• ID String: chuỗi xác định một UI Element không hash
➢ Chuột phải vào danh sách Events hiện lên ContextMenuStrip (Hình 3.5) với các chức năng:
• Copy Selected: copy vào Clipboard giá trị ID của UI Element
• Test Selected: tìm giá trị UI Element từ chuỗi ID
• Delete Selected: xóa các dòng được chọn trong danh sách
• Clear All: xóa tất cả dòng
• Get Value: lấy giá trị của UI Element đang được chọn
• Set Value: Đặt thử giá trị là chuỗi có giá trị 123 cho UI Element đang được chọn
• Get Code: phát sinh mã tất cả các giá trị trong danh sách và ghi vào phần Code
Hình 3.5: Menu hiển thị các lựa chọn tương tác cho một UI Element
➢ Properties: hiển thị chi tiết các UI Element được chọn khi double click vào một UI Element được chọn trong danh sách ListView Ở đây có một số property cần quan tâm, và tìm kiếm để xác định duy nhất một UI Element như AutomationId, ControlType, ClassName, Name (Hình 3.6)
Hình 3.6: Các Properties của một UI Element
Hình 3.7: Giao diện của tab Logs
Hình 3.7 mô tả giao diện logs: ghi nhận các bước trong quá trình biên dịch file script, kết quả chạy các lệnh, và lỗi (nếu có) Ví dụ như tìm hoặc không tìm được UI Element tương ứng
Hình 3.8: Giao diện tab Code
Hình 3.8 mô tả nội dung của một file script: chứa các lệnh load từ file script để biên dịch và xử lý, nhấn nút Run để chạy và Stop để dừng lại Trình biên dịch chạy trên một thread riêng độc lập với thread chính giao diện của chương trình, từ đó có thể cancel nếu cần thiết
Hình 3.9: Giao diện tab Options
➢ Trong phần tùy chọn Options: có 2 mode tùy chọn là Manual (bắt Element khi nhấn Left Control, bằng cách tạo event khi Key Pressed là phím Left Control trên bàn phím) hoặc Auto (bắt Element khi click chuột, bằng cách tạo event khi Mouse Pressed là Left Click) trên ứng dụng cần test
➢ Options cho phép chọn một hoặc nhiều giá trị Properties để xác định một UI Element như sau:
➢ Waitings (ms): thời gian chờ (mặc định 500ms) khi biên dịch giữa 2 lệnh liên tiếp nhau trong script.
Cấu trúc chương trình
Được lập trình theo hướng đối tượng, các hàm chức năng được đóng gói trong từng class độc lập, tạo sự thuận lợi trong việc nâng cấp và phát triển sau này Được phân thành các class như sau:
• Class Form1: giao diện chính của chương trình
• Class AutomationExtensions: các hàm liên quan đến UI Automation
• Class Compiler: các hàm liên quan đến trình biên dịch
• Class CRC32: các hàm liên quan đến hash CRC32 một chuỗi cho trước
• Class DrawRectangle: các hàm phục vụ việc vẽ highlight element
Hình 3.10 mô tả mối quan hệ giữa các class:
Hình 3.10: Tương quan giữa các Class
➢ Khi nhấn phím Left Control (ở mode Manual) hoặc click chuột (ở chế độ
Auto), lấy tọa độ vị trí mouse trên màn hình, từ đó dùng hàm FromPoint để xác định trả về UI Element mà chuột đang click vào Lấy Property BoundingRectangle của UI Element này, từ đó vẽ đường viền chữ nhật màu đỏ highlight Element được chọn để xác định vị trí cụ thể Element một cách trực quan (Hình 3.11) Lập trình đường hình chữ nhật sẽ tự mất sau 3 giây bằng một bộ định thời Timer, các hàm liên quan đến vẽ hình trong Class DrawRectangle
Hình 3.11: Ví dụ highlight nút số 9 của ứng dụng Calculator
➢ Sau khi đã xác định được UI Element:
• Từ thành phần Element đó duyệt lên gốc của cây UI Elements để lấy Element cửa sổ chính của ứng dụng Sau khi xác định được cửa sổ chính của ứng dụng cần test, thực hiện lấy đường dẫn đến file thực thi exe của ứng dụng này
• Lấy ProcessId của ứng dụng này so sánh với ứng dụng hiện hành bằng hàm Process.GetCurrentProcess().Id Mục đích là chỉ lấy AutomationElement của ứng dụng cần ghi lại thao tác, không lấy UI Element của ứng dụng chính
• Lần đầu tiên vẽ toàn bộ cây element, với RootElement là cửa sổ chính của ứng dụng cần test và các nhánh là các Element thành phần Mỗi node của cây này trỏ đến Element tương ứng Khi click vào một node sẽ lấy Property của Element đó và ghi lại thông tin vào Properties
• Sau khi bắt được 1 element khác, tìm kiếm element đó trên cây và các nhánh con Nếu tìm thấy thì highlight node đó trên cây Nếu không tìm thấy: cấu trúc element của cây ứng dụng đã bị thay đổi, khi đó vẽ lại cây
• Có thể chọn 4 giá trị Properties để xác định một UI Element như sau:
Có 2^4 tổ hợp giá trị có thể được chọn, do đó dùng chuỗi 1 ký tự thập lục phân từ 0 đến f để biểu diễn giá trị này Bằng cách bật các giá trị bit cờ tương ứng, ta có thể xác định các giá trị Property được chọn:
- AutomationId: bit 3 - ClassName: bit 2 - ControlType: bit 1 - Name: bit 0
Ví dụ: chọn 2 giá trị AutomationId và ClassName (Hình 3.12) để xác định một UI Element => giá trị chọn là 1100 = 12 (decimal) = C (hex) Ghép giá trị này vào 8 bytes hash CRC32 của AutomationId + ClassName, ta được một mã giá trị 9 bytes đại diện cho một Element
Hình 3.12: Lựa chọn các giá trị Properties để xác định một UI Element
ClassName + AutomationId = Button139 Hash CRC32 34151907 (8 bytes)
Giá trị chọn là 1100 c (hex) thêm vào mã 9 bytes đại diện cho Element là c34151907
Dùng các hàm xử lý bit: public void setBit(ref int num, int x) { num |= 1 0) { s = _textQueue.Dequeue(); switch (s.ToLower()) { case "(":
_sy = Token.LPar; break; case ")":
_sy = Token.RPar; break; case "=":
_sy = Token.Equals; break; case "if":
_sy = Token.If; break; default:
} s = GetLine(); while (s != null && s.Trim().Length == 0) { s = GetLine();
//if (s[0] == null) { string[] parts = Regex.Split(s, @"(\()|(\))|(\s)"); switch (parts[0].ToLower()) { case "if":
_sy = Token.NumberIf; break; case "else":
_sy = Token.NumberElse; break; case "end":
_sy = Token.NumberEnd; break; case "var":
_sy = Token.Variable; break; case "setid":
_sy = Token.SetID; break; case "getid":
_sy = Token.GetID; break; case "pushid":
_sy = Token.PushID; break; case "showid":
_sy = Token.ShowID; break; case "runapp":
_sy = Token.RunApp; break; case "waitid":
_sy = Token.WaitID; break; default:
} if (_sy == Token.RunApp) { string part = ""; for (int i = 1; i < parts.Length; i++) { part += parts[i];
} else if (_sy != Token.Text) for (int i = 1; i < parts.Length; i++) { string part = parts[i].Trim(' ', '\t'); if (part != "") {
Hàm RunApp
Cú pháp: RunApp App_Path Công dụng: chạy ứng dụng cần test từ đường dẫn App_Path Chờ đến khi ứng dụng đã load xong bằng cách kiểm tra MainTile và có đáp ứng được với input của người dùng hay chưa Sau khi ứng dụng đã load xong, lấy Top Elemet của ứng dụng này var processStartInfo = new ProcessStartInfo(fullPath); var process = Process.Start(processStartInfo); while (string.IsNullOrEmpty(process.MainWindowTitle)) {
System.Threading.Thread.Sleep(100); process.Refresh();
} process.WaitForInputIdle(); topElement = FindChildByProcessId(AutomationElement.RootElement, process.Id);
Hàm GetID
Cú pháp: GetID Variable Element_String Công dụng: Tìm Automation Element (AE) từ chuỗi Element_String và gán cho biến Variable Quá trình tìm kiếm được thực hiện từ trên gốc xuống nhánh của cây Element theo chuỗi ID được xác định bởi Element_String.
Hàm PushID
Cú pháp: PushID Element_String Công dụng: Tìm AE từ chuỗi Element_String và thực hiện thao tác Invoke
(click) vào AE tìm được.
Hàm ShowID
Cú pháp: ShowID Element_String
Công dụng: Tìm AE từ chuỗi Element_String và xuất ra màn hình giá trị tương ứng của AE.
Hàm SetID
Cú pháp: SetID Value Element_String Công dụng: Tìm AE từ chuỗi Element_String và gán giá trị Value cho AE tìm được.
Hàm WaitID
Cú pháp: WaitID Value Element_String Công dụng: Tìm AE từ chuỗi Element_String, lấy giá trị của AE tìm được So sánh giá trị này với biến Value, nếu bằng thì hiện kết quả thời gian đã chờ (tính theo ms) và chạy lệnh kế tiếp, không thì chờ đến giá trị của AE này bằng với biến Value hoặc timeout
Mục đích kiểm tra việc bắt các thành phần UI Element, mã hóa các thành phần này thành các ID riêng biệt Từ đó có thể tương tác với các UI Element này theo các giá trị ID của nó tùy theo mục đích khác nhau và lưu lại thành file script dưới dạng từng dòng lệnh Sau đó chạy lại file script này, phân tích nó bởi trình biên dịch để đọc hiểu nội dung các lệnh và thực thi các lệnh này giống như yêu cầu
3.3.1 Tets ứng dụng calculator của Windows
Test các lệnh như runapp, getid, setid, showid, waitid, pushid trên các thành phần UI Element và lệnh rẽ nhánh có điều kiện if Đối với lệnh điều kiện if, tùy theo kết quả thực tế như thế nào thì sẽ xử lý theo các hướng khác nhau
Thực hiện: Để xác định kết quả tính toán, ta xác định UI Element được viền đỏ như hình 3.14 Các UI Element khác thực hiện tương tự để lấy giá trị ID của chúng Sau khi đã xác định được ID, ta thêm các lệnh để tương tác các UI Element này
Hình 3.14: Test trên ứng dụng Calculator
File script và ý nghĩa các lệnh:
RunApp C:\Windows\System32\calc1.exe //load và chạy ứng dụng calculator từ đường dẫn //C:\Windows\System32\calc1.exe getid result 6d3a34f8|6d3a34f8|8ca3b4c4
//lấy giá trị của UI Element kết quả lưu vào biến result if (result = 3)
//nếu result bằng 3 pushid 6d3a34f8|6d3a34f8|ea432058 //nhấn phím “9” pushid 6d3a34f8|6d3a34f8|65927c88 //nhấn phím “+” pushid 6d3a34f8|6d3a34f8|9ad73271 //nhấn phím “=” else //nếu giá trị khác 3 waitid 123 6d3a34f8|6d3a34f8|8ca3b4c4 //chờ đến khi giá trị là 123 setid 999 6d3a34f8|6d3a34f8|8ca3b4c4 //đặt lại giá trị là 999 end //kết thúc lệnh if showid 6d3a34f8|6d3a34f8|8ca3b4c4 //lấy kết quả và xuất ra màn hình
3.3.2 Test ứng dụng Softphone 3CX
Mục đích: Đo thời gian từ lúc quay số đến khi kết nối thành công của ứng dụng softphone (client) đến tổng đài voice ip (server) Đối với các kỹ sư quản lý chất lượng kỹ thuật
QA (Quality Assurance), việc kiểm tra chất lượng kết nối giữa client và server trong hệ thống tổng đài voice ip rất quan trọng Một số yêu cầu đặt ra là:
• Các máy con có kết nối được với tổng đài hay không
• Thời gian kết nối thực hiện trong phạm vi cho phép, không được chờ quá lâu
• Tổng đài cùng một lúc có thể đáp ứng được rất nhiều kết nối hay không
Việc kiểm tra quay số kết nối từ các clients mất rất nhiều thời gian và nhàm chán Do đó, dùng hệ thống test automation trong đề tài này thực hiện các công việc trên một cách tự động
Xây dựng cài đặt một hệ thống tổng đài nội bộ, sử dụng tổng đài rất nổi tiếng là 3CX Phone System (http://www.3cx.com) Đây là tổng đài IP PBX (Private Branch eXchange), hỗ trợ giao thức SIP (Session Initiation Protocol) hiện được rất nhiều công ty lớn sử dụng
Theo mục đích test automation đã nêu ở phần trên, đầu tiên ta thực hiện đăng ký máy client softphone 3CX số 101 Thực hiện quay số “100” và nhấn nút “Call” để kết nối đến số 100 (operator tổng đài nội bộ) Chờ cho đến khi kết nối thành công, ghi nhận lại thời gian đã chờ và kết thúc Để xác định được khi nào thì kết nối đến máy “100” thành công, ta căn cứ vào
UI Element hiển thị trạng thái như trên hình 3.15, bình thường máy ở trạng thái “On Hook”, khi kết nối thành công sẽ chuyển sang trạng thái “Connected”
Thực hiện lấy giá trị ID các UI Element cần thiết và gán các lệnh tương tác với các ID này theo yêu cầu đã đặt ra
Hình 3.15: Giao diện của ứng dụng softphone 3CX
Dưới đây là file script và ý nghĩa các lệnh thực thi, các dòng chú thích bắt đầu bởi dấu “//” sẽ được bỏ qua trong quá trình biên dịch
RunApp C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.exe //load và chạy ứng dụng 3CXPhone từ đường dẫn
//C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.exe showid d0a03840|749e7b71|1ffceb41|261222e6
//hiển thị giá trị trạng thái của phone (như hình là “On Hook”) PUSHID d0a03840|749e7b71|1ffceb41|70706eaf
PUSHID d0a03840|749e7b71|1ffceb41|9fb20591 //Nhấn phím “0”
PUSHID d0a03840|749e7b71|1ffceb41|9fb20591 //Nhấn phím “0”
PUSHID d0a03840|749e7b71|1ffceb41|60bcd17e //Nhấn phím “Call”
WaitId Connected d0a03840|749e7b71|1ffceb41|261222e6 //chờ đến khi giá trị trạng thái của phone là “Connected”
//tức là đã kết nối được với máy cần gọi, sau đó hiện giá trị thời gian //chờ (ms) và kết thúc
Hình 3.16: Kết quả test trên ứng dụng softphone 3CX
Hình 3.16 cho thấy kết quả kết nối thành công của client (đầu số 101) đến người vận hành operator của tổng đài (đầu số 100).