Ответ 1
Очень простое решение в конце - просто вызванный метод SeleniumTestCase tearDown() (т.е. мы вызываем super.tearDown() из нашего базового тестового класса)
Это успешно завершает все окна браузера.
Я проводил тесты на селен с использованием селена rc в течение примерно 6 месяцев, и внезапно открывается окно selfenium firefox, которое не закрывается, когда тест закончен.
Я использую конкретный профиль firefox и не обновлял мой selenium rc jar. Я думал, что, возможно, последняя сборка firefox, возможно, была проблемой, но я вернулся к firefox 2, и окна все еще остаются открытыми.
Я запускаю тест в окне Windows.
Я заметил, что у других людей возникает такая проблема - просто интересно, есть ли у кого-нибудь решение?
Спасибо, Gearoid.
Очень простое решение в конце - просто вызванный метод SeleniumTestCase tearDown() (т.е. мы вызываем super.tearDown() из нашего базового тестового класса)
Это успешно завершает все окна браузера.
Моим решением было использовать driver.quit()
(это автоматически закроет браузер Firefox) вместо driver.close()
- хотя было открыто только одно окно Firefox AFAIK.
У нас была эта проблема, и после некоторого исследования мы ее исправили.
В Selenium RC у вас есть файл "grid_configuration.yml", где у вас есть список браузеров и их соответствующий идентификатор, например "* firefox". В зависимости от вашей среды, когда вы выполняете "firefox", вы, вероятно, будете называть обертку, псевдоним или символическую ссылку исполняемого файла firefox. Когда Selenium запущен, он создает некоторый процесс вилки для браузера и в зависимости от того, вы вызываете исполняемый файл firefox напрямую или оболочку, создание этого процесса отличается, и когда он пытается убить процесс в tearDown(), он фактически убивает дочерний процесс и сохраняет отца живым, поэтому tearDown() не закрывает браузер.
Решением является файл "grid_configuration.yml", изменяющий "* firefox" для абсолютного пути исполняемого файла браузера (всегда с * в начале)
Мы используем Microsoft свободно sysinternals pskill, чтобы убить браузер (включая firefox).
Запустив pskill "firefox.exe"
, он убьет окно FireFox.
Если вам нужно выполнить это на удаленной машине, вы можете использовать [psexec][3]
. Кроме того, для обоих есть командные переключатели, чтобы автоматически принимать EULA (-accepteula), поэтому вам не нужно.
Gearóid: Я не вижу, как это решит проблему. super.tearDown() вызывается автоматически после каждого тестового примера любым способом, поэтому выполнение дополнительного вызова только запустит его дважды.
Я заметил, что окна браузера не закрываются, пока сервер Selenium не остановлен. Итак, в моем случае, если есть 100 тестов селена, у меня было бы 200 окон Firefox открытыми до того, как они будут закрыты, когда выйдет сервер Selenium.
(Я запускаю Fedora 13 и Firefox 3.6.7)
Используя TestNG, вы можете предшествовать функции teardown()
с помощью аннотации @AfterMethod
или @AfterTest
вместо @AfterClass
.
Если вы используете python в конце вашего tearDown, используйте super(unittest2.TestCase,self).tearDown()
Используя MSTest, я вызывал driver.Quit() в TestCleanup, но в конце тестов я оставил загруженные окна Firefox.
Я обнаружил, что исключение NoSuchElementException, по-видимому, не позволяет драйверу успешно вызывать quit, поэтому он завершает TestCleanup с помощью try/finally:
[TestCleanup]
public void TestCleanUp()
{
try
{
driver.FindElement(By.Id("ctl00_btnClearSession")).Click();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until((d) => { return d.FindElement(By.Id("ctl00_btnClearSession")).Displayed; });
}
finally {
driver.Quit();
}
}
Это сработало с проблемой, с которой я все время сталкивался, но может случиться так, что я должен также завершить все мои TestMethods с помощью try/finally. Это далеко не идеально, но я больше не вижу окон, когда я это делаю.
У меня была такая же проблема. Я запускаю Selenium как часть моих модульных тестов Visual Studio и имел ту же проблему с браузерами Firefox, которые не закрываются в конце тестов.
Две вещи исправили это для меня:
1) Я обновил папку /core на веб-сайте с обновленной версией.
2) Я обнаружил, что селен дважды вызывал мой метод Set Up в базовом классе. Контр-интуитивно (по крайней мере для меня) кажется, что селен автоматически вызывает метод установки в родительском классе. Если вы попытаетесь вызвать его в настройке дочернего класса (то есть с чем-то вроде base.setup()), он будет работать дважды и открыть окна Firefox, которые он не может закрыть. Я удалил вызовы на base.setup(), и все мои дополнительные проблемы окон были решены.
Простые дни с вопроса 3-го дня рождения я представляю еще одно неясное решение:
Мой Firefox был в обычном месте. Поскольку я не хотел прибегать к индивидуальному аргументу JVM каждый раз, когда я запускал свои тесты Selenium локально, я помещаю сквозной script в /usr/local/bin
. Предположительно, Selenium убивал начатый процесс (мой script), а не браузер.
Итак, я вернулся к использованию аргумента JVM для пользовательских местоположений браузера:
-Dwebdriver.firefox.bin="/path/to/firefox"