Разница между webdriver.Dispose (), .Close () и .Quit ()


285

В чем разница между этими

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

Какой из них использовать и когда?


2
Метод #dispose, по-видимому, был незаметно удален из API WebDriver. В журнале изменений нет упоминаний, последнее упоминание, которое я смог найти, было v2.26 api docs, ссылки на который я больше не могу найти.
jordanpg

Я вижу, откуда возникла путаница в ответах ниже. Я думаю, что этот вопрос изначально был вопросом C #, так как описанные выше методы (Close, Quit and Dispose) начинаются с заглавной буквы (C #), а не строчной буквы (java). Утилизация не была удалена из привязок клиента C # WebDriver.
rcasady616

Утилизация - это шаблон .Net, поэтому он не задокументирован в документации по селену API. В RemoteWebDriver Quit вызывает команду 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 Server. Если сеанс не закрыт, файлы журнала для этого сеанса остаются в памяти.


Как вы обновили свои исключения? Просто перейти к каждому и добавить выход ()?
Марк Мейо

1
В тестовом фрейме, таком как NUnit, JUnit, вам нужно только убедиться, что Dispose () находится в TestTeardown () или TestFixtureTeardown (). В C # вы можете просто использовать оператор using, и Dispose всегда вызывается, если возникает исключение. Вы можете сделать что-то подобное в Java, используя команду catch catch и команду Dispose в finally.
rcasady616

1
@ rcasady616 Это лучшее объяснение, которое я получил. Спасибо за это, и я думаю, что это достойно для upvote.
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.quitметодами в WebDriver. Я надеюсь, что вы найдете это полезным.

На следующем сайте есть несколько полезных советов по тестированию селена: Ссылка


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

14

quit(): Выходит из этого драйвера, закрывая все связанные окна, которые были открыты.

close() : Закрыть текущее окно, выйдя из браузера, если это последнее открытое окно.


в этом ответе пропущено ключевое отличие: quit () остановит базовую службу webdriver, а close () - нет. pro-tip: никогда не вызывайте close (), если остается только одно окно
Кори Голдберг

5

close (): - Предположим, что вы открыли несколько окон браузера с одним и тем же экземпляром драйвера, теперь вызов close () для экземпляра драйвера закроет текущее окно, на которое указывает экземпляр драйвера. Но экземпляр драйвера все еще остается в памяти и может использоваться для обработки других открытых окон браузера.

quit (): - Если вы вызываете quit () для экземпляра драйвера и у вас открыто одно или несколько окон браузера, он закроет все открытые окна браузера, а экземпляр драйвера будет удален, т.е. удален из памяти. Так что теперь вы не можете использовать этот экземпляр драйвера для выполнения других операций после вызова quit (). Если вы сделаете это, вы получите исключение.

dispose (): - Я не думаю, что есть метод dispose для экземпляра WebDriver.

Вы можете перейти к этой официальной ссылке для ознакомления.


«Я не думаю, что есть метод удаления для экземпляра 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 () работают одинаково. Оба будут различаться по своим функциям, если во время автоматизации открыто более одного окна браузера.

Для выше Ref: нажмите здесь

Dispose Команда 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 () вызывает Dispose.

  3. WebDriver.Dispose() Этот метод закрывает все окна браузера и безопасно завершает сеанс


4
если вы цитируете что-то, вы должны указать источник.
Мейрион Хьюз

2

Насколько я понимаю driver.close();, закроет текущий браузер и driver.quit();прекратит работу всего браузера.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.