Selenium не закрывается на KeyboardInterrupt (Python) - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь закрыть Firefox экземпляр, который открылось моим приложением, когда пользователь прерывает программу. Но селен не закрывает окно. Вот пример кода, который показывает проблему:

import time

from selenium import webdriver

driver = webdriver.Firefox()

try:
    while True:
        driver.get("https://google.com")
        time.sleep(5)
except KeyboardInterrupt:
    print("Quitting")
    driver.quit()
    print("Done")

Когда я нажимаю Ctrl + C, я вижу «Выход», напечатанный на консоли, через несколько секунд я вижу «Готово», напечатанный на консоль и программа заканчиваются. Но firefox окно остается открытым. Как я могу решить эту проблему?

Редактировать:

import time

from selenium import webdriver

driver = webdriver.Firefox()

try:
    for i in range(5):
        print("Looping")
        driver.get("https://google.com")
        time.sleep(5)
except KeyboardInterrupt:
    print("Quitting")
    driver.quit()
    print("Done")
driver.quit()
print("After loop and stuff")

Это тоже не сработает. Если вы подождите l l 1013 *, браузер успешно закроется. Но если вы нажмете Ctrl + C в середине l oop, браузер останется открытым.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Я провел исследование по этой проблеме и проверил все возможные ресурсы, доступные на дискуссионном форуме Stackoverflow и Selenium на github.

Та же проблема возникла здесь и закрыта позже из-за отсутствия надлежащего решения. Вы можете проверить детали здесь. Эта проблема указывает c до Windows и firefox. На MA C OS работает нормально. Основная причина, по которой я узнаю, что это происходит из-за Geckodriver, это получение cra sh, здесь вы можете проверить, что geckodriver-logs

Они пытались использовать последние Python привязки и последние Гекодривер тоже. Нет чистого решения, вместо этого есть обходной путь с процессом уничтожения firefox.exe, сгенерированным драйвером Firefox.

Пожалуйста, посмотрите.

    tasklist = check_output(["tasklist", "/fi", "imagename eq firefox.exe"], shell=True).decode()
    currentFFIDs = re.findall(r"firefox.exe\s+(\d+)", tasklist)

    driver = webdriver.Firefox(options=opts, executable_path='./bin/geckodriver.exe')

    tasklist = check_output(["tasklist", "/fi", "imagename eq firefox.exe"], shell=True).decode()
    firefoxIds = set(re.findall(r"firefox.exe\s+(\d+)", tasklist)).difference(currentFFIDs)

 # do your stuff

    try:
        driver.close()
        driver.quit()

        # Could't close the driver via normal means-- Force Close #
        except:
            taskkill = 'taskkill /f '+''.join(["/pid "+f+" " for f in firefoxIds]).strip()
            check_output(taskkill.split(), shell=True)
            print("\nHAD TO FORCE-CLOSE FIREFOX", flush=True)
0 голосов
/ 04 февраля 2020

Вы можете попробовать использовать with оператор в своем коде, подробности можно найти здесь :

import time
from selenium import webdriver

driver = webdriver.Firefox()

with driver:
    while True:
        driver.get("https://google.com")
        time.sleep(5)

Если вы хотите поймать KeyboardInterrupt или / и SystemExit, вы можете найти полезную информацию здесь .

Я проверил мой код и код ниже в терминале, и Firefox вполне как ожидалось:

import time
from selenium import webdriver

driver = webdriver.Firefox()

try:
    for i in range(5):
        print("Looping")
        driver.get("https://google.com")
        time.sleep(5)
except KeyboardInterrupt:
    print("quitting: KeyboardInterrupt")
finally:
    driver.quit()
    print("Done")
0 голосов
/ 02 февраля 2020

Нет условия завершения, пока l oop .... Ваше время l oop работает бесконечно. Блок прерываний клавиатуры никогда не выполняется, так как элемент управления не выходит из строя в то время как l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...