Різниця між webdriver.Dispose (), .Close () та .Quit ()


285

Яка різниця між ними

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

Який використовувати і коли?


2
Здається, метод #dispose був мовчки скинутий з API WebDriver. Ніякої згадки в журналі змін, найновішою згадкою, яку я міг знайти, є v2.26 api-документи, на які я більше не можу знайти посилання.
jordanpg

Я бачу, звідки йде плутанина у відповідях нижче. Я думаю, що це питання спочатку було питанням C #, оскільки вищезазначені методи (Закрити, Закрити та розпорядитися) починаються з великої літери (C #), а не малої літери (Java). Утилізація не була викинута з клієнтських прив’язок C # WebDriver.
rcasady616

Dispose - це .Net-модель, і тому вона не зафіксована в документах API селену. У RemoteWebDriver вийдіть з виклику Dispose, який надсилає команду Quit (DELETE / session / {sessionId}). На стороні клієнта є кілька місць, де перехоплюється команда Quit. Наприклад, реалізація FirefoxDriver .net фактично здійснить виклик process.Kill (), якщо процес не завершиться граціозно.
Тамір Даніелі

Відповіді:


244

Це добре запитання, яке я бачив, як люди використовують Close (), коли не повинні. Я заглянув у вихідний код для прив'язки Selenium Client & WebDriver C # і виявив наступне.

  1. webDriver.Close() - Закрийте вікно браузера, на яке драйвер має фокус
  2. webDriver.Quit() - Виклик розпорядження ()
  3. webDriver.Dispose() Закриває всі вікна браузера і безпечно закінчує сеанс

Нижче наведений код розпоряджається об’єктом драйвера, завершує сеанс і закриває всі браузери, відкриті під час тесту, невдалий чи пройдений тест.

public IWebDriver Driver;

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

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

Підсумовуючи підсумок, переконайтеся, що виклик Quit () або Dispose () перед виходом із програми та не використовуйте метод Close (), якщо ви не впевнені в тому, що робите.

Примітка.
Це питання я знайшов, коли спробував з’ясувати пов'язану проблему, чому у моїх віртуальних машин не вистачає місця на жорсткому диску. Виявляється, виняток змусив Quit () або Dispose () не викликати кожен запуск, що призвело до того, що папка appData заповнила жорсткий диск. Таким чином, ми використовували метод Quit () правильно, але код був недоступний. Підсумок: переконайтеся, що всі кодові шляхи очистять ваші некеровані об'єкти, використовуючи безпечні шаблони виключень або реалізуючи IDisposable

Також
у випадку, коли RemoteDriver викликає Quit () або Dispose (), також закриє сеанс на сервері Selenium. Якщо сеанс не закритий, файли журналу цього сеансу залишаються в пам'яті.


Як ви оновили свої винятки? Просто перейдіть до кожного і додайте quit ()?
Марк Майо

1
У роботі тестових кадрів, таких як NUnit, JUnit, вам потрібно лише переконатися, що Dispose () знаходиться в TestTeardown () або TestFixtureTeardown (). У C # ви можете просто використовувати оператор "using", і Dispose завжди викликається, якщо буде винято виняток. Ви можете зробити щось подібне в Java, скориставшись спробу лову і нарешті поставити Dispose.
rcasady616

1
@ rcasady616 Це найкраще пояснення, яке я отримав. Дякую за це, і я вважаю, що це гідно для виплат.
RNS

2
@ Mr.Bultitude ну, це зрозуміло, враховуючи те немає ніякої різниці ^^ В Відповідно до цього відповіддю, Quit()це редиректDispose()
PixelMaster

1
@PixelMaster, так, на 100% правильно, це в основному переадресація. Не будучи тим, хто написав код у Selenium, я можу лише здогадуватися, чому обидва способи є у прив'язках клієнта C #. Ймовірно, вони хочуть дотримуватися загального методу "Виходу" з різних мов клієнта, але також хотіли використовувати драйвер у синтаксисі оператора "using" (відьма вимагатиме методу Dispose ()). Це я найкраще здогадуюсь, або це чи код потрібно очистити.
rcasady616

47

Close() - Він використовується для закриття веб-переглядача або сторінки, на якій зараз зосереджено фокус.

Quit() - Він використовується для вимкнення екземпляра веб-драйвера або знищення екземпляра веб-драйвера (Закрийте всі вікна).

Dispose() - Мені не відомий цей метод.


3
Якщо ви використовуєте прив’язки до мови .NET, Quitі Disposeметоди повинні бути синонімами один для одного. Іншими словами, Quitдзвінки Dispose.
JimEvans

23

driver.close і driver.quit це два різні способи закриття сеансу браузера в Selenium WebDriver. Розуміння обох і розуміння, коли використовувати кожен метод, є важливим при виконанні тесту. Тому я спробував пролити трохи світла на обидва ці методи.

driver.close- Цей метод закриває вікно браузера, на якому встановлено фокус. Незважаючи на знайому назву для цього методу, WebDriverніяк НЕ реалізувати AutoCloseableінтерфейс .

driver.quit- Цей метод в основному називає driver.disposeвнутрішній метод, який, в свою чергу, закриває всі вікна браузера і закінчує сесію WebDriver витончено.

driver.dispose- Як уже згадувалося раніше, це внутрішній метод WebDriver, який мовчки скинуто відповідно до іншої відповіді - Потрібна перевірка. Цей метод справді не має випадку використання у звичайному тестовому робочому процесі, оскільки будь-який з попередніх методів повинен працювати для більшості випадків використання.

Випадок використання пояснення: Ви повинні використовувати driver.quitкожен раз, коли Ви хочете закінчити програму. Це закриє всі відкриті вікна браузера та завершує сеанс WebDriver. Якщо ви не використовуєте driver.quitв кінці програми, сеанс WebDriver не закриється належним чином, а файли не будуть очищені з пам'яті. Це може призвести до помилок у витоку пам'яті.

Наведене вище пояснення повинно пояснити різницю між методами driver.closeта driver.quitWebDriver. Сподіваюсь, вам це стане в нагоді.

На наступному веб-сайті є кілька хороших порад щодо тестування селену: Посилання


Я також помітив, що IEDrivers, які використовуються для роботи з автоматизацією на основі IE, не виходить, якщо ви використовуєте метод driver.close (). Мені довелося використовувати driver.quit (), щоб припинити його. Це тому, що метод quit () також видається для очищення ресурсів на відміну від close (), хоча, у моєму прикладі, у мене завжди є одна вкладка.
Паван Діттакаві

14

quit(): Закриває цей драйвер, закриваючи кожне відкрите вікно.

close() : Закрийте поточне вікно, вийдіть із браузера, якщо це останнє відкрите в даний час вікно.


ця відповідь пропускає ключову різницю: quit () зупинить базовий сервіс веб-драйвера, тоді як close () не робить. підказка: ніколи не дзвоніть закрити (), якщо залишається лише одне вікно
Corey Goldberg

5

close (): - Припустимо, ви відкрили кілька вікон браузера з одним і тим же екземпляром драйвера, тепер виклик close () на екземплярі драйвера закриє поточне вікно, на яке вказується екземпляр драйвера. Але екземпляр драйвера все ще залишається в пам'яті і може використовуватися для обробки інших відкритих вікон браузера.

quit (): - Якщо ви зателефонуєте quit () на екземпляр драйвера і відкрито одне чи більше вікон браузера, він закриє всі відкриті вікна браузера, а екземпляр драйвера збирається сміттям, тобто видаляється з пам'яті. Тому тепер ви не можете використовувати цей екземпляр драйвера для виконання інших операцій після виклику на ньому quit (). Якщо ви це зробите, викинете виняток.

dispose (): - Я не думаю, що існує метод розпорядження для екземпляра WebDriver.

Ви можете перейти до цього офіційного посилання на селен java doc для довідок.


"Я не думаю, що існує метод розпорядження для екземпляра WebDriver." Впевнений, що є (принаймні, на C #).
EJoshuaS

5

На основі випуску на Github з PhantomJS, quit () не завершує процес PhantomJS. Ви повинні використовувати:

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

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

посилання


5

close () - команда webdriver, яка закриває вікно браузера, яке зараз зосереджено. Незважаючи на знайому назву для цього методу, WebDriverніяк НЕ реалізувати AutoCloseableінтерфейс .

Під час процесу автоматизації, якщо відкрито більше одного вікна веб-переглядача, команда close () закриє лише поточне вікно браузера, на яке фокусується на той час. Решта вікон браузера не закриються. Наступний код можна використовувати для закриття поточного вікна браузера:

quit () - команда webdriver, яка викликає метод driver.dispose, який, у свою чергу, закриває всі вікна браузера та припиняє сеанс WebDriver. Якщо ми не будемо використовувати quit () наприкінці програми, сеанс WebDriver не закриється належним чином, а файли не будуть очищені від пам'яті. Це може призвести до помилок у витоку пам'яті.

Якщо процес автоматизації відкриває лише одне вікно браузера, команди close () та quit () працюють однаково. Обидва будуть відрізнятися своєю функціональністю, коли під час автоматизації буде відкрито більше одного вікна браузера.

Для вищезгаданого посилання: натисніть тут

Команда розпорядження Dispose () повинна викликати Quit (), і, здається, це є. Однак у нього є та сама проблема, що будь-які наступні дії блокуються, поки PhantomJS не закриється вручну.

Посилання на посилання


3

Різниця між driver.close () & driver.quit ()

driver.close - Це закриває вікно браузера, на якому встановлено фокус.

driver.quit - Це, в основному, викликає метод driver.dispose, який, в свою чергу, закриває всі вікна браузера і закінчує сесію WebDriver витончено.


2

Selenium WebDriver

  1. WebDriver.Close()Цей метод використовується для закриття поточного відкритого вікна. Він закриває поточне відкрите вікно, на яке драйвер має зосередитися.

  2. WebDriver.Quit()Цей метод використовується для знищення екземпляра WebDriver. Він закриває всі вікна браузера, пов’язані з цим драйвером, і безпечно закінчує сеанс. WebDriver.Quit () викликає розпорядження.

  3. WebDriver.Dispose() Цей метод закриває всі вікна браузера і безпечно закінчує сеанс


4
якщо ви цитуєте щось, вам слід дати джерело.
Меїріон Х'юз

2

Я розумію driver.close();, що закриє поточний веб-переглядач і driver.quit();скасує весь цей браузер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.