Как закрыть Headless Firefox после выполнения теста с использованием Selenium и Python - PullRequest
0 голосов
/ 19 июня 2020

Я следовал этому руководству, чтобы узнать, как использовать Selenium, и я только что успешно выполнил следующий код:

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

opts = Options()opts.headless=True
assert opts.headless # Operating in headless mode
browser = Firefox(options=opts)browser.get('https://bandcamp.com')
browser.find_element_by_class('playbutton').click()

Как убедиться, что Firefox без головы больше не работает? Я дважды запускал этот код, и теперь две песни воспроизводятся друг над другом. Любая помощь приветствуется, я просто хочу убедиться, что ничего не работает в фоновом режиме!

Ответы [ 4 ]

0 голосов
/ 20 июня 2020

Вне зависимости от браузера на основе GUI или браузера, в конце выполнения теста вы всегда должны вызывать browser.quit(), который вызывает /shutdown endpoint, а затем WebDriver экземпляр и Контекст просмотра оба уничтожаются, полностью закрывая все страницы / вкладки / windows.

Таким образом, ваш эффективный блок кода будет:

# previous lines of code
browser.find_element_by_class('playbutton').click()
browser.quit()

Вы можете найти подробное обсуждение в Phantom JS веб-драйвер остается в памяти


Однако в самых редких случаях могут быть остатки из WebDriver например, ChromeDriver , занимающих память, в этих случаях вам нужно убить их с помощью грубой силы перед запуском следующего выполнения теста следующим образом:

  • Python Решение (Windows):

    import os
    
    os.system("taskkill /f /im geckodriver.exe /T")
    os.system("taskkill /f /im chromedriver.exe /T")
    os.system("taskkill /f /im IEDriverServer.exe /T")
    
  • Python Решение (кросс-платформенное):

    import os
    import psutil
    
    PROCNAME = "geckodriver" # or chromedriver or IEDriverServer
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == PROCNAME:
        proc.kill()
    

Подробное обсуждение можно найти в Selenium: Как остановить geckodriver процесс, влияющий на память P C, без вызова driver.quit ()?

0 голосов
/ 19 июня 2020

Просто добавьте

browser.close()

Также вы можете проверить список процессов (например, lsof в Ubuntu)

0 голосов
/ 19 июня 2020

Вы можете добавить browser.close(), чтобы закрыть активную вкладку и browser.quit(), чтобы закрыть весь браузер windows и завершить сеанс / процесс драйвера.

0 голосов
/ 19 июня 2020

Из учебника, которым вы поделились:

Кажется, все работает. Чтобы предотвратить накопление невидимых экземпляров браузера без заголовка на вашем компьютере, вы закрываете объект браузера перед выходом из сеанса Python:

Попробуйте сделать следующее, чтобы увидеть, исправлены ли ваши проблемы:

browser.close()
quit()

РЕДАКТИРОВАТЬ:

Давайте прямо. Итак, на основании вашего запроса у нас в настоящее время есть:

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
from selenium import webdriver # you need this to terminate program 

options = Options() 
options.headless = True

driver = webdriver.Firefox(options=options)

driver.get('https://bandcamp.com')

driver.find_element_by_class('playbutton').click()

ch = input('Do you want to quit the program y/n?')
if ch == 'y':
    driver.quit()
    print('The program is terminated')

Сообщите мне, если решение не сработает

...