Sự khác biệt giữa webdo.Dispose (), .Close () và .Quit ()


285

Sự khác biệt giữa những điều này là gì

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

Cái nào sẽ được sử dụng và khi nào?


2
Phương thức #dispose dường như đã bị loại bỏ khỏi API WebDriver. Không đề cập đến trong thay đổi, gần đây nhất tôi có thể tìm thấy là v2,26 tài liệu api, mà tôi không thể tìm thấy liên kết cho nữa.
jordanpg 8/8/2015

Tôi thấy sự nhầm lẫn đến từ đâu trong các câu trả lời dưới đây. Tôi nghĩ rằng câu hỏi này ban đầu là một câu hỏi C # vì các phương pháp ở trên (Đóng, Thoát và Loại bỏ) bắt đầu bằng chữ in hoa (C #) chứ không phải chữ thường (java). Vứt bỏ đã không được loại bỏ khỏi các ràng buộc máy khách C # WebDriver.
RCasady616

Vứt bỏ là một mẫu .Net và do đó không được ghi lại trong các tài liệu API của selen. Trong RemoteWebDriver, Thoát cuộc gọi Dispose, sẽ gửi lệnh Quit (DELETE / session / {sessionId}). Có một vài vị trí ở phía máy khách nơi lệnh Quit bị chặn. Ví dụ, việc triển khai FirefoxDriver .net sẽ thực sự thực hiện một cuộc gọi.Kill () nếu quá trình không tắt một cách duyên dáng.
Tamir Daniely

Câu trả lời:


244

Đây là một câu hỏi hay mà tôi đã thấy mọi người sử dụng Close () khi họ không nên. Tôi đã xem mã nguồn của Selenium Client & WebDriver C # Bindings và tìm thấy như sau.

  1. webDriver.Close() - Đóng cửa sổ trình duyệt mà trình điều khiển tập trung vào
  2. webDriver.Quit() - Gọi vứt bỏ ()
  3. webDriver.Dispose() Đóng tất cả các cửa sổ trình duyệt và kết thúc phiên một cách an toàn

Mã dưới đây sẽ loại bỏ đối tượng trình điều khiển, kết thúc phiên và đóng tất cả các trình duyệt đã mở trong quá trình kiểm tra xem thử nghiệm có bị lỗi hay không.

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

Tóm lại, đảm bảo rằng Quit () hoặc Dispose () được gọi trước khi thoát khỏi chương trình và không sử dụng phương thức Đóng () trừ khi bạn chắc chắn về những gì bạn đang làm.

Lưu ý
Tôi đã tìm thấy câu hỏi này khi cố gắng tìm ra một vấn đề liên quan tại sao máy ảo của tôi hết dung lượng ổ cứng. Hóa ra một ngoại lệ đã khiến Quit () hoặc Dispose () không được gọi mỗi lần chạy, sau đó khiến thư mục appData lấp đầy ổ cứng. Vì vậy, chúng tôi đã sử dụng phương thức Quit () một cách chính xác nhưng mã không thể truy cập được. Tóm tắt đảm bảo tất cả các đường dẫn mã sẽ dọn sạch các đối tượng không được quản lý của bạn bằng cách sử dụng các mẫu an toàn ngoại lệ hoặc triển khai IDis Dùng

Ngoài ra,
trong trường hợp RemoteDriver gọi Quit () hoặc Dispose () cũng sẽ đóng phiên trên Máy chủ Selenium. Nếu phiên không đóng, các tệp nhật ký cho phiên đó vẫn còn trong bộ nhớ.


Làm thế nào bạn cập nhật ngoại lệ của bạn? Chỉ cần đi đến từng cái và thêm một thoát ()?
Đánh dấu Mayo

1
Trong khung kiểm tra hoạt động như NUnit, JUnit bạn chỉ phải đảm bảo rằng Dispose () nằm trong TestTeardown () hoặc TestFixtureTeardown (). Trong C #, bạn chỉ có thể sử dụng câu lệnh "bằng cách sử dụng" và Vứt bỏ luôn được gọi nếu có ngoại lệ được nêu ra. Bạn có thể làm một cái gì đó tương tự trong Java bằng cách sử dụng một thử bắt cuối cùng và đặt Dispose vào cuối cùng.
RCasady616

1
@ RCasady616 Đây là lời giải thích tốt nhất mà tôi có. Cảm ơn vì điều đó và tôi nghĩ rằng nó xứng đáng với upvote.
RNS

2
@ Mr.Bultitude tốt, đó là điều dễ hiểu, xem xét có có sự khác biệt ^^ Theo câu trả lời này, Quit()là một chuyển hướng tớiDispose()
PixelMaster

1
@PixelMaster, Có chính xác 100%, về cơ bản nó là một chuyển hướng. Không phải là người đã viết mã trong Selenium, tôi chỉ có thể đoán tại sao cả hai phương thức đều có mặt trong các ràng buộc máy khách C #. Có lẽ họ muốn giữ một phương thức chung để "Thoát" trên các ngôn ngữ máy khách, nhưng cũng muốn sử dụng trình điều khiển trong cú pháp câu lệnh "bằng cách sử dụng" (witch sẽ yêu cầu phương thức Dispose ()). Đó là dự đoán tốt nhất của tôi, hoặc mã hoặc cần phải được làm sạch.
RCasady616

47

Close() - Nó được sử dụng để đóng trình duyệt hoặc trang hiện đang tập trung.

Quit() - Nó được sử dụng để tắt phiên bản trình điều khiển web hoặc hủy phiên bản trình điều khiển web (Đóng tất cả các cửa sổ).

Dispose() - Tôi không biết phương pháp này.


3
Nếu bạn đang sử dụng các ràng buộc ngôn ngữ .NET, các phương thức QuitDisposenên là từ đồng nghĩa với nhau. Nói cách khác, Quitcác cuộc gọi Dispose.
JimEvans

22

driver.closedriver.quitlà hai phương pháp khác nhau để đóng phiên trình duyệt trong Selenium WebDriver. Hiểu cả hai và biết khi nào nên sử dụng từng phương pháp là điều quan trọng trong quá trình thực hiện kiểm tra của bạn. Do đó, tôi đã cố gắng làm sáng tỏ cả hai phương pháp này.

driver.close- Phương pháp này đóng cửa sổ trình duyệt nơi đặt tiêu điểm. Mặc dù cái tên quen thuộc đối với phương pháp này, WebDriverkhông phải thực hiện các AutoCloseablegiao diện .

driver.quit- Phương thức này về cơ bản gọi driver.disposemột phương thức nội bộ hiện đang đóng tất cả các cửa sổ trình duyệt và kết thúc phiên WebDriver một cách duyên dáng.

driver.dispose- Như đã đề cập trước đây, là một phương thức nội bộ của WebDriver đã bị bỏ âm thầm theo một câu trả lời khác - Cần xác minh. Phương pháp này thực sự không có trường hợp sử dụng trong quy trình kiểm tra bình thường vì một trong các phương pháp trước đó sẽ hoạt động với hầu hết các trường hợp sử dụng.

Trường hợp sử dụng giải thích: Bạn nên sử dụng driver.quitbất cứ khi nào bạn muốn kết thúc chương trình. Nó sẽ đóng tất cả các cửa sổ trình duyệt đã mở và chấm dứt phiên WebDriver. Nếu bạn không sử dụng driver.quitvào cuối chương trình, phiên WebDriver sẽ không đóng đúng cách và các tệp sẽ không bị xóa khỏi bộ nhớ. Điều này có thể dẫn đến lỗi rò rỉ bộ nhớ.

Giải thích trên sẽ giải thích sự khác biệt giữa driver.closedriver.quitcác phương thức trong WebDriver. Tôi hy vọng bạn thấy nó hữu dụng.

Trang web sau đây có một số mẹo hay về kiểm tra selen: Liên kết


14

quit(): Thoát khỏi trình điều khiển này, đóng mọi cửa sổ liên quan đã mở.

close() : Đóng cửa sổ hiện tại, thoát khỏi trình duyệt nếu đó là cửa sổ cuối cùng hiện đang mở.


câu trả lời này bỏ qua sự khác biệt chính: Thoát () sẽ dừng dịch vụ webroll bên dưới, trong khi close () thì không. pro-tip: đừng bao giờ gọi close () nếu chỉ còn một cửa sổ
Corey Goldberg

5

close (): - Giả sử bạn đã mở nhiều cửa sổ trình duyệt có cùng phiên bản trình điều khiển, bây giờ gọi close () trên phiên bản trình điều khiển sẽ đóng cửa sổ hiện tại mà phiên bản trình điều khiển được trỏ đến. Nhưng phiên bản trình điều khiển vẫn còn trong bộ nhớ và có thể được sử dụng để xử lý các cửa sổ trình duyệt mở khác.

Thoát (): - Nếu bạn gọi thoát () trên phiên bản trình điều khiển và có một hoặc nhiều cửa sổ trình duyệt mở, nó sẽ đóng tất cả các cửa sổ trình duyệt đang mở và phiên bản trình điều khiển là rác được thu thập tức là xóa khỏi bộ nhớ. Vì vậy, bây giờ bạn không thể sử dụng cá thể trình điều khiển này để thực hiện thao tác khác sau khi gọi thoát () trên nó. Nếu bạn làm điều đó sẽ ném một ngoại lệ.

dispose (): - Tôi không nghĩ có một phương thức xử lý cho một cá thể WebDriver.

Bạn có thể vào liên kết tài liệu java chính thức của selenium này để tham khảo.


"Tôi không nghĩ có một phương thức xử lý cho một cá thể WebDriver." Chắc chắn là có (ít nhất là trong C #).
EJoshuaS - Phục hồi Monica

5

Dựa trên một vấn đề trên Github của PhantomJS, việc thoát () không chấm dứt quá trình PhantomJS. Bạn nên sử dụng:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

liên kết


5

close () là một lệnh webdo đóng cửa sổ trình duyệt hiện đang được tập trung. Mặc dù cái tên quen thuộc đối với phương pháp này, WebDriverkhông phải thực hiện các AutoCloseablegiao diện .

Trong quá trình tự động hóa, nếu có nhiều hơn một cửa sổ trình duyệt được mở, thì lệnh close () sẽ chỉ đóng cửa sổ trình duyệt hiện tại đang tập trung tại thời điểm đó. Các cửa sổ trình duyệt còn lại sẽ không bị đóng. Đoạn mã sau có thể được sử dụng để đóng cửa sổ trình duyệt hiện tại:

Thoát () là một lệnh webdo gọi phương thức driver.dispose, lần lượt đóng tất cả các cửa sổ trình duyệt và chấm dứt phiên WebDriver. Nếu chúng tôi không sử dụng thoát () vào cuối chương trình, phiên WebDriver sẽ không được đóng đúng cách và các tệp sẽ không bị xóa khỏi bộ nhớ. Điều này có thể dẫn đến lỗi rò rỉ bộ nhớ.

Nếu quá trình Tự động hóa chỉ mở một cửa sổ trình duyệt duy nhất, các lệnh close () và exit () hoạt động theo cùng một cách. Cả hai sẽ khác nhau về chức năng của chúng khi có nhiều hơn một cửa sổ trình duyệt được mở trong Tự động hóa.

Đối với giới thiệu ở trên: bấm vào đây

Lệnh Vứt bỏ () nên gọi Quit () và nó xuất hiện. Tuy nhiên, nó cũng có một vấn đề tương tự ở chỗ mọi hành động tiếp theo đều bị chặn cho đến khi PhantomJS được đóng bằng tay.

ref Liên kết


3

Sự khác biệt giữa driver.close () & driver.quito ()

driver.c Đóng - Nó đóng cửa sổ trình duyệt nơi đặt tiêu điểm.

driver.quito - Về cơ bản, nó gọi phương thức driver.dispose, lần lượt đóng tất cả các cửa sổ trình duyệt và kết thúc phiên WebDriver một cách duyên dáng.


2

Selenium WebDriver

  1. WebDriver.Close()Phương pháp này được sử dụng để đóng cửa sổ mở hiện tại. Nó đóng cửa sổ mở hiện tại mà trình điều khiển đã tập trung vào.

  2. WebDriver.Quit()Phương pháp này được sử dụng để phá hủy thể hiện của WebDriver. Nó đóng tất cả Windows Browser được liên kết với trình điều khiển đó và kết thúc phiên một cách an toàn. WebDriver.Quit () gọi Vứt bỏ.

  3. WebDriver.Dispose() Phương pháp này đóng tất cả các cửa sổ Trình duyệt và kết thúc phiên một cách an toàn


4
nếu bạn trích dẫn một cái gì đó bạn nên cung cấp cho nguồn.
Meirion Hughes

2

Sự hiểu biết của tôi là driver.close();sẽ đóng trình duyệt hiện tại và driver.quit();sẽ chấm dứt tất cả các trình duyệt đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.