Đóng cửa sổ xử lý Selenium Python
Kiểm thử tự động là một bước quan trọng trong quy trình phát triển của một sản phẩm phần mềm. Trong một môi trường phát triển linh hoạt, nơi có sự phát triển, triển khai và bảo trì liên tục các sản phẩm phần mềm, kiểm thử tự động đảm bảo rằng các sản phẩm phần mềm cuối cùng được phân phối không có lỗi Show
Trong thế giới tự động hóa, Selenium là một trong những khung thử nghiệm tự động hóa nguồn mở được sử dụng rộng rãi nhất để thực hiện các thử nghiệm trình duyệt web tự động trên các trang web. Selenium có thể chạy thử nghiệm tự động trên nhiều trình duyệt khác nhau (e. g. , Chrome, Firefox, Edge, v.v. ). Các tập lệnh tự động hóa thử nghiệm có thể được tạo ra bằng cách sử dụng các khung phổ biến được cung cấp bởi các ngôn ngữ như C #, Java, JavaScript, Python, v.v. Các trường hợp kiểm thử tự động mà bạn thực hiện bằng Selenium có thể dẫn bạn đến những trường hợp cần phải xử lý nhiều cửa sổ trong khi làm việc với một ứng dụng web. Tình huống này có thể phát sinh do nhấp vào nút trên trang web mở ra URL tới tab mới hoặc cửa sổ mới. Ví dụ: nền tảng tìm kiếm việc làm Glassdoor sẽ mở ra một cửa sổ mới khi bạn nhấp vào các nút để đăng nhập bằng tài khoản Google hoặc tài khoản Facebook của mình Nhấp vào nút “Tiếp tục với Facebook” để đăng nhập Một cửa sổ trang web Facebook sẽ bật lên để nhắc bạn đăng nhập Do đó, người dùng có thể cần truy cập vào cửa sổ trình duyệt đang mở để tiếp tục Là một QA tester, việc chạy một test case có thể yêu cầu bạn hoàn thành một số thao tác trong cửa sổ hoặc tab trình duyệt mới mở trước khi quay lại cửa sổ hoặc tab ban đầu để hoàn thành các tác vụ còn lại Trong blog này về cách xử lý nhiều cửa sổ trong Selenium Python, chúng ta sẽ thảo luận về những điều cơ bản về cửa sổ trình duyệt và cách xử lý nhiều cửa sổ trong Selenium Python. Đến cuối blog, bạn sẽ có thể xử lý nhiều cửa sổ khi chúng phát sinh khi thực hiện các trường hợp thử nghiệm Cửa sổ trình duyệt trong Selenium là gì?Cửa sổ trình duyệt, còn được gọi là cửa sổ chính hoặc cửa sổ chính, là phần điều khiển của trang chủ hoặc trang web đang mở hiện tại mà người dùng truy cập sau khi truy cập trình duyệt. Khi chạy tập lệnh tự động hóa Selenium, cửa sổ chính sẽ khởi chạy. Tạo phiên Selenium WebDriver sẽ mở ra một cửa sổ theo mặc định nằm dưới sự kiểm soát của WebDriver Để xem cửa sổ chính trông như thế nào, đây là cửa sổ của trang web LambdaTest Selenium Playground Selenium WebDriver luôn giữ ngữ cảnh của cửa sổ chính khi điều hướng đến một URL được xác định để mở một cửa sổ mới. Cửa sổ con sẽ nằm trong ngữ cảnh của cửa sổ cha. Điều này cho phép điều hướng qua lại giữa các cửa sổ sau khi bạn hoàn thành các thao tác mà bạn đang xử lý trong cửa sổ con mới mở Đây là tất cả về cửa sổ trình duyệt trong Selenium. Trong phần tiếp theo của blog này về cách xử lý nhiều cửa sổ trong Selenium Python, chúng ta sẽ tìm hiểu thêm về các cửa sổ con trong Selenium Cửa sổ con trong Selenium là gì?Khi chúng ta nhấp vào một nút hoặc liên kết URL trong cửa sổ chính và hành động đó sẽ mở ra (các) cửa sổ khác trong cửa sổ chính, (các) cửa sổ mới đó được gọi là cửa sổ con. (Các) cửa sổ hoặc (các) tab mới được mở được gọi là con của cửa sổ chính và có các tay cầm cửa sổ duy nhất Để minh họa cách xử lý các cửa sổ con, hãy sử dụng LambdaTest Selenium Playground mà chúng tôi đã đề cập trước đó
Hai cửa sổ con Ba cửa sổ con Trang hiện tại bạn đang truy cập là cửa sổ chính, trong khi các cửa sổ (trang web Facebook, Twitter và LambdaTest) mở bằng cách nhấp vào các nút là cửa sổ con Có thể mở một cửa sổ hoặc nhiều cửa sổ con từ một cửa sổ chính. Cũng cần lưu ý rằng một cửa sổ con có thể chứa hoặc không chứa liên kết URL Trong khi tiến hành một trường hợp thử nghiệm theo cách thủ công, thật đơn giản để kiểm tra hành vi của các cửa sổ con do khả năng hiển thị của chúng trong ngữ cảnh của cửa sổ mẹ. Tuy nhiên, điều này không xảy ra khi sử dụng Selenium để tự động hóa test case vì chúng ta cần thay đổi ngữ cảnh của WebDriver từ cửa sổ cha sang cửa sổ con để thực hiện các thao tác trên đó Xử lý cửa sổ trong Selenium Python là gì?Vì chúng ta đã thảo luận về khái niệm cửa sổ trong Selenium trong phần trên của blog này về cách xử lý nhiều cửa sổ trong Selenium Python, chúng ta hãy chuyển sang tìm hiểu cách kiểm soát nhiều cửa sổ Nhiều cửa sổ được đưa ra bởi các tình huống trong đó một ứng dụng web điều hướng đến hoặc mở nhiều cửa sổ trình duyệt. Selenium cung cấp tùy chọn xử lý nhiều cửa sổ bằng tay cầm cửa sổ Selenium WebDriver không phân biệt giữa cửa sổ và tab. Nó xử lý cả hai bằng cách sử dụng tay cầm cửa sổ. Bất cứ khi nào một cửa sổ được mở, nó chứa một ID riêng biệt trả về một giá trị chuỗi, làm cho nó trở thành duy nhất và tồn tại trong toàn bộ phiên Sử dụng trang Window Popup Modal Demo từ trang web LambdaTest Selenium Playground, chúng ta có thể thấy ID của cửa sổ trình duyệt chính và cửa sổ con, như minh họa bên dưới Làm cách nào để xử lý nhiều cửa sổ trong Selenium Python?Chúng ta có thể xử lý sự xuất hiện của các cửa sổ con hoặc tab khi chạy các trường hợp thử nghiệm bằng Selenium Python. Khi cửa sổ cha mở cửa sổ con, WebDriver chỉ điều khiển một cửa sổ tại một thời điểm trong phiên chạy WebDriver kiểm soát cửa sổ chính và mọi hành động trong tập lệnh kiểm tra sẽ được thực thi trong cửa sổ hiện đang hoạt động Selenium Python WebDriver cung cấp các phương thức sau để xử lý nhiều cửa sổ current_window_handle()Phương pháp này thu thập ID xử lý cửa sổ duy nhất của cửa sổ trình duyệt hiện đang hoạt động cú pháp. tài xế. current_window_handle window_handles()Phương thức này trả về ID của tất cả các cửa sổ đã được WebDriver mở trong phiên hiện tại. Nó lưu trữ ID cửa sổ được sử dụng để chuyển đổi cửa sổ cú pháp. tài xế. window_handles chuyển sang. cửa sổ()Phương pháp này chuyển tiêu điểm của WebDriver từ cửa sổ trình duyệt hiện đang mở sang cửa sổ trình duyệt dự định. Id của cửa sổ được nhắm mục tiêu được chuyển làm đối số để chuyển điều khiển của WebDriver sang cửa sổ mới cú pháp lựa chọn 1. tài xế. chuyển sang. cửa sổ() Lựa chọn 2. tài xế. chuyển sang. cửa sổ() Tự động hóa các bài kiểm tra Python của bạn sau vài giây. Thử LambdaTest ngay
trình diễn. Làm cách nào để xử lý nhiều cửa sổ trong Selenium Python?Bây giờ chúng ta đã xem xét các phương pháp khác nhau có sẵn trong Selenium Python để xử lý nhiều cửa sổ, phần này về cách xử lý nhiều cửa sổ trong Selenium Python sẽ xem xét cách thực hiện các kiểm tra Selenium này trên lưới Selenium đám mây Cách tiếp cận tốt nhất để sử dụng đầy đủ thử nghiệm tự động hóa Python và nhanh chóng đạt được kết quả mong muốn là sử dụng Lưới Selenium dựa trên đám mây. Chúng tôi có thể tự động hóa việc xử lý nhiều cửa sổ trong Selenium Python bằng cách sử dụng nền tảng Lưới Selenium dựa trên đám mây như LambdaTest LambdaTest cho phép bạn thực hiện kiểm tra trình duyệt chéo tự động trên quy mô lớn bằng cách sử dụng đám mây Selenium IDE. Nền tảng này cung cấp một nhóm trình duyệt trực tuyến gồm hơn 3000 trình duyệt web thực chạy trên các hệ điều hành khác nhau để đảm bảo rằng các doanh nghiệp phát triển các ứng dụng phần mềm chất lượng cao nhanh hơn Bạn cũng có thể Đăng ký Kênh YouTube LambdaTest và cập nhật các hướng dẫn mới nhất về kiểm tra trình duyệt tự động, kiểm tra Selenium, kiểm tra Cypress E2E, CI/CD, v.v. Thiết lập dự ánĐể bắt đầu viết bài kiểm tra tự động hóa web Python, chúng ta cần cài đặt Python và Selenium trên máy khách. Nếu bạn không quen với Selenium bằng Python, bạn có thể xem blog chi tiết này về cách bắt đầu với Selenium Python Có nhiều khung kiểm tra Python khác nhau có sẵn để kiểm tra Selenium, bao gồm PyUnit (unittest), pytest, Behave, Robot, Lettuce, Nose2 và Testify. Bạn có thể tìm hiểu thêm về các khung kiểm tra Selenium Python này một cách chi tiết trong bài đăng trên blog này về các khung kiểm tra Python tốt nhất Tuy nhiên, trong blog này về cách xử lý nhiều cửa sổ trong Selenium Python, chúng tôi sẽ sử dụng khung thử nghiệm pytest. Pytest là một khung tự động hóa web Python nguồn mở chủ yếu được sử dụng để thử nghiệm đơn vị và có thể mở rộng bằng cách hỗ trợ các thử nghiệm tự động hóa cho các chức năng, API và thử nghiệm đơn vị Hướng dẫn chi tiết về Selenium pytest này có thể hướng dẫn bạn thêm về cách định cấu hình và bắt đầu sử dụng Khung pytest để thực hiện các kiểm tra tự động trong Selenium Python Chúng tôi sử dụng IDE VS Code (Visual Studio ) để viết và chạy các tập lệnh tự động hóa Selenium Python cho dự án trường hợp thử nghiệm của chúng tôi. Ngoài Mã VS, còn có các IDE khác như Atom, PyCharm và Sublime Text cũng có thể được sử dụng để viết các tập lệnh thử nghiệm Trình quản lý gói chúng tôi sử dụng là PIP, trình quản lý gói mặc định cho Python. Nó được cài đặt sẵn khi bạn cài đặt Python (phiên bản 3. 4 trở lên). Pip cho phép bạn cài đặt và quản lý các gói bổ sung không có trong thư viện chuẩn Python. Các gói này được xây dựng đặc biệt để sử dụng cho các khung, tiện ích và mô-đun phát triển khác nhau Phần trình diễn của dự án test case sẽ được chạy trên hệ điều hành Windows. Ngoài ra, các bước về cách thiết lập dự án trên macOS cũng đã được bao gồm
các cửa sổ. pip –phiên bản hệ điều hành Mac. pip –phiên bản các cửa sổ hệ điều hành Mac. Sudo pip cài đặt virtualenv các cửa sổ hệ điều hành Mac. virtualenv multiwindowstest hệ điều hành Mac. nguồn multiplewindowstest/bin/kích hoạt
Thư viện autopep8 thực thi hướng dẫn kiểu PEP 8 trên mã Python để đảm bảo nó ở đúng định dạng, trong khi flake8 là thư viện kiểm tra mã Python để tìm lỗi trái với hướng dẫn kiểu PEP 8 Plugin pytest-xdist là một phần mở rộng của pytest giới thiệu chế độ thực thi thử nghiệm mới cho phép chúng tôi thực hiện các thử nghiệm Selenium Python song song
Cú pháp – cài đặt pip [tên thư viện] đóng băng pip> yêu cầu. txt Hãy tạo một thư mục có tên là “seltests” trong thư mục gốc của dự án để chứa các tập lệnh kiểm tra Trước khi chạy thử nghiệm, vui lòng đặt các biến môi trường LT_USERNAME & LT_ACCESS_KEY từ thiết bị đầu cuối. Chi tiết tài khoản có sẵn trên trang Hồ sơ LambdaTest Đối với macOS
cho Linux
Cho cửa sổ
Chạy tập lệnh kiểm tra Python trên hơn 3000 thiết bị và trình duyệt. Thử LambdaTest ngay
Xử lý một cửa sổ con duy nhất trong Selenium PythonChúng ta hãy xem cách triển khai xử lý cửa sổ trên một cửa sổ con duy nhất trong tình huống thử nghiệm sau trường hợp thử nghiệm
Triển khai (Trường hợp thử nghiệm trên Trình duyệt Chrome) Thực thi mã Để chạy các tập lệnh kiểm tra, hãy nhập lệnh sau trong thiết bị đầu cuối python -m pytest seltests/test_single_window_handling_chrome. py Sau khi kiểm tra được thực thi, đầu ra trong thiết bị đầu cuối sẽ hiển thị GUIDS của cửa sổ cha và con, như minh họa bên dưới Sau khi thực thi thử nghiệm hoàn tất, bạn có thể xem kết quả và nhật ký trong phần Bản dựng của Bảng điều khiển tự động hóa LambdaTest Bạn có thể xem bản ghi thử nghiệm và nhật ký của các thử nghiệm đã thực hiện Hướng dẫn mã Bây giờ, chúng ta hãy đi qua mã chúng tôi đã viết chi tiết Bước 1. Tại đây, chúng tôi nhập các thư viện Selenium Python quan trọng sẽ cho phép chúng tôi thực hiện thử nghiệm của mình. Chúng bao gồm pytest, WebDriver, By, BrowserOptions, WebDriverWait, vàexpected_conditions Chúng tôi nhập pytest, vì đây là công cụ kiểm tra đơn vị chính của Selenium Python. Selenium WebDriver đã nhập là một khung web tự động kiểm tra trình duyệt chéo Truy vấn Theo được sử dụng để định vị các phần tử web cụ thể bằng phương thức find_element(). Thời gian chờ rõ ràng triển khai lớp WebDriverWait kết hợp với lớpexpected_conditions để xác định thời gian chờ một điều kiện nhất định được thực thi trước khi chuyển sang phần tiếp theo của mã Cuối cùng, lớp Tùy chọn tùy chỉnh các phiên trình điều khiển trình duyệt đã chỉ định. Đối với trường hợp này, chúng tôi đang sử dụng các lớp ChromeOptions Bước 2. Chúng tôi tạo các tùy chọn bằng cách sử dụng Trình tạo khả năng tự động hóa LambdaTest theo trình duyệt mà chúng tôi sử dụng để chạy thử nghiệm tự động. Chúng tôi tạo một thể hiện của lớp Tùy chọn, đặt các điều kiện và chuyển nó tới hàm tạo trình điều khiển Bước 3. Chúng tôi đặt tên người dùng và mã truy cập được cung cấp trong trang Hồ sơ LambdaTest thành biến remote_url kết nối chúng tôi với Lưới Selenium từ xa (@hub. lambdatest. com/wd/trung tâm). Sau đó, chúng tôi sử dụng remote_url và các tùy chọn để khởi tạo trình duyệt web tương ứng (Chrome) Bước 4. Chúng tôi mở trang web LambdaTest Playground, sau đó tối đa hóa cửa sổ trình duyệt để định vị phần tử web có liên kết đến Trang trình diễn cửa sổ bật lên Nhấp chuột phải vào liên kết “Windows Popup Modal” và nhấp vào kiểm tra để mở công cụ kiểm tra trình duyệt. Phần tử web được định vị bằng cách sử dụng thẻ href của nó Chúng tôi sử dụng trình điều khiển. phương thức current_window_handle để lấy id duy nhất của cửa sổ chính và lưu trữ dưới dạng chuỗi Bước 5. Sau đó, chúng tôi xác định vị trí phần tử web bằng nút “Theo dõi trên Twitter” bằng cách sử dụng tiêu đề của phần tử đó và nhấp vào phần tử đó để mở một cửa sổ con Chúng tôi lưu trữ các tay cầm cửa sổ của các cửa sổ đã mở trong một biến gọi là all_guid Bước 6. Sau đó, chúng tôi chuyển sang cửa sổ con bằng trình điều khiển. chuyển sang. phương pháp cửa sổ (hướng dẫn). Mã lặp lại qua các tay cầm cửa sổ được lưu trữ và nếu nó đi qua tay cầm cửa sổ chính, nó sẽ bỏ qua và chuyển sang cửa sổ con. Sau đó ID của cửa sổ con được in Người lái xe. close() đóng cửa sổ con hiện đang hoạt động và sẽ thoát phiên trình điều khiển nếu cửa sổ con là cửa sổ hoạt động duy nhất Sau đó, chúng tôi đóng phiên trình duyệt bằng phương thức driverquit() trong Selenium Xử lý nhiều cửa sổ con trong Selenium PythonTrong phần trên của blog này về cách xử lý nhiều cửa sổ trong Selenium Python, chúng ta đã xem xét cách xử lý một cửa sổ con duy nhất trong Selenium bằng Python. Chúng ta hãy xem cách triển khai xử lý cửa sổ của nhiều cửa sổ con trong các tình huống bên dưới Trường hợp thử nghiệm (Chuyển cửa sổ theo tiêu đề trang)
Thực thi mã Chúng tôi thực thi các tập lệnh kiểm tra trong thiết bị đầu cuối bằng lệnh sau python -m pytest seltests/test_multiple_windows_handling_chrome. py Thử nghiệm chạy thành công trong thiết bị đầu cuối và hiển thị đầu ra sau, như hình bên dưới Chúng ta có thể xem kết quả của tập lệnh thử nghiệm trong phần Bản dựng LambdaTest Nhật ký và bản ghi của bài kiểm tra cũng được hiển thị Hướng dẫn mã Mã được viết để triển khai xử lý nhiều cửa sổ con trong Selenium bằng Python tương tự như mã được viết để xử lý một cửa sổ con. Tuy nhiên, sự khác biệt xuất hiện khi lặp qua các tay cầm cửa sổ, khi chúng tôi chỉ ra sự khác biệt giữa các cửa sổ con dựa trên tiêu đề trang tương ứng của chúng Trong trang “Window Popup Modal”, chúng tôi tìm nút “Theo dõi Twitter & Facebook” bằng ID của nó trong công cụ kiểm tra. Chúng tôi nhấp vào nút, sau đó sẽ mở ra hai cửa sổ con Tay cầm cửa sổ của các cửa sổ hiện đang mở được lưu trữ trong một biến gọi là all_guid và tổng số cửa sổ đang mở được ghi lại trong biến num_of_handles Mã lặp qua tất cả các bộ điều khiển cửa sổ được lưu trữ, xác định các bộ điều khiển cửa sổ con và chuyển sang các cửa sổ con. Mã kiểm tra tiêu đề trang của cửa sổ con và in nó. Các cửa sổ con sau đó được đóng lại bằng trình điều khiển. phương thức đóng () Phiên trình điều khiển sau đó cuối cùng được đóng lại bằng phương thức thoát () Chuyển về cửa sổ chính từ cửa sổ con trong Selenium PythonChúng ta hãy xem xét một tình huống trong đó chúng ta muốn chuyển về cửa sổ cha từ cửa sổ con sau khi hoàn thành một số thao tác. Điều này có nghĩa là chúng ta phải thay đổi điều khiển của WebDriver thành cửa sổ chính Chúng tôi sẽ triển khai kịch bản được thảo luận trong phần trên của blog này về cách xử lý nhiều cửa sổ trong Selenium Python để chứng minh việc chuyển trở lại cửa sổ chính Thực thi mã Chúng tôi chạy tập lệnh thử nghiệm trong thiết bị đầu cuối bằng lệnh sau python -m pytest seltests/test_switch_to_parent_window_chrome. py Tập lệnh kiểm tra sẽ thực thi thành công trong thiết bị đầu cuối và hiển thị đầu ra sau Chúng tôi có thể xem kết quả thử nghiệm trong bảng điều khiển LambdaTest Builds Hướng dẫn mã Trong tập lệnh thử nghiệm, sau khi điều hướng qua các cửa sổ con và thực hiện các thao tác mà chúng tôi đã chỉ định trong kịch bản trước đó, các cửa sổ con đang mở sẽ đóng lại. Sau đó, chúng tôi chuyển trở lại cửa sổ chính bằng cách sử dụng switch_to. phương thức window(parent_guid) với biến parent_guid làm đối số của phương thức. Sau đó, chúng tôi in tay cầm của cửa sổ chính Phiên trình điều khiển cuối cùng đã đóng bằng trình điều khiển. phương thức thoát () Nếu bạn là một lập trình viên Python đang muốn nâng tầm sự nghiệp của mình lên một tầm cao mới, thì bạn có thể sử dụng chứng chỉ Selenium Python 101 từ LambdaTest Phần kết luậnTrong hướng dẫn Selenium Python này, chúng tôi đã trình bày chi tiết cửa sổ là gì và cách xử lý nhiều cửa sổ khi chúng xuất hiện trong thử nghiệm bằng Selenium Python. Chúng ta đã xem xét hai loại cửa sổ—cửa sổ cha và cửa sổ con. Chúng tôi đã viết các kịch bản thử nghiệm triển khai xử lý cửa sổ cho một cửa sổ con và nhiều cửa sổ con. Chúng tôi cũng đã xem xét cách quay lại cửa sổ chính sau khi hoàn thành các thao tác trên cửa sổ con. Ngoài ra, công cụ kiểm tra trực quan Selenium có thể giúp bạn tìm ra các lỗi khó nắm bắt trong trang web Tôi hy vọng blog này về cách xử lý nhiều cửa sổ trong Selenium Python sẽ giúp ích cho bạn trong khi thực hiện kiểm thử tự động Câu hỏi thường gặp (FAQ)Làm cách nào để chuyển đổi giữa các cửa sổ trong Python?window_handles là danh sách id cửa sổ. Nó lưu trữ tất cả thông tin về các cửa sổ đang mở trong python. Cú pháp lưu id cửa sổ như sau window_handles = [Cửa sổ1, Cửa sổ2, Cửa sổ3] Nó có thể được sử dụng để chuyển đổi giữa các cửa sổ khác nhau bằng cách sử dụng phương thức switch_to. Cú pháp chuyển giữa các cửa sổ như sau Cửa sổ1 = hệ thống. switch_to(Window2) Để chuyển đổi giữa hai cửa sổ, chúng ta cần lưu trữ id của cửa sổ đầu tiên và sau đó sử dụng nó khi muốn chuyển sang cửa sổ khác Đâu là sự khác biệt giữa getWindowHandles() và getWindowHandle()?Các phương thức getWindowHandles và getWindowHandle có thể được sử dụng để xử lý các cửa sổ con. Phương thức getWindowHandles lưu trữ tất cả các tay cầm cửa sổ đã mở trong cấu trúc dữ liệu Set. Phương thức getWindowHandle được sử dụng để lưu trữ tiêu điểm xử lý cửa sổ của cửa sổ trình duyệt Làm cách nào để đóng tay cầm cửa sổ trong Selenium Python?Cách đóng trình duyệt trong Selenium . tài xế. Thoát() tài xế. từ bỏ() Làm cách nào để đóng cửa sổ mới trong Selenium Webdriver Python?Cảm ơn. tab đóng là Command + 'w' .
Làm cách nào để đóng trình điều khiển trong Selenium Python?close() Phương thức close() là một lệnh Webdriver đóng cửa sổ trình duyệt hiện đang là tiêu điểm. Tốt nhất là sử dụng lệnh close() khi nhiều tab hoặc cửa sổ trình duyệt đang mở. Nếu chỉ có một cửa sổ được mở trong toàn bộ trình duyệt thì lệnh close() sẽ thoát khỏi toàn bộ phiên trình duyệt.
Sự khác biệt giữa bỏ () và đóng () là gì?từ bỏ(). Phương thức quit() thoát trình điều khiển, đóng mọi cửa sổ liên quan. tài xế. Thoát(). Phương thức close() đóng cửa sổ hiện tại, thoát khỏi trình điều khiển nếu cửa sổ hiện tại là cửa sổ duy nhất đang mở. Nếu không có cửa sổ nào mở, nó sẽ báo lỗi |