如何避免 selenium 驱动程序自动关闭?

How to avoid selenium driver closing automatically?

在我的问题之前,向您展示我的代码的一般结构可能会有所帮助:

class ItsyBitsy(object):
    def __init__(self):
        self.targets_a = dict() # data like url:document_summary 
                                # filled by another function  


    def visit_targets_a(self):
        browser = webdriver.Safari()

        for url in self.targets_a.keys():
            try:
                browser.switch_to.new_window('tab')
                browser.get(url)
                time.sleep(2)

            except Exception as e:
                print(f'{url} FAILED: {e}')
                continue

            # do some automation stuff

            time.sleep(2)

        print('All done!')

然后我可以实例化 class 并毫无问题地调用我的方法:

spider = ItsyBitsy()
spider.visit_targets_a()


>>> All done!

然而,在打开每个选项卡并完成自动化后,window 会在没有任何提示的情况下关闭,即使我的代码中没有任何 browser.close()browser.exit()

我的创可贴修复方法是在最后一个循环中调用 time.sleep(9999999999999999),由于 Overflow Error,这使 window 无限期打开,但这显然不是解决方案。

那么,如何阻止浏览器退出?!

如果你能告诉我为什么会这样,加分。

谢谢guys/gals!

你在使用 VS 代码吗?半年前我遇到了同样的问题,切换到 Sublime text 解决了这个问题。这个问题之所以出现,是因为 VS Code 对 运行 python 代码有一种奇怪的方式(通过扩展)——当最后一行代码被执行时,它会杀死脚本创建的所有进程。

您需要覆盖 exit 并防止 'browser.quit()' 自动发生。

如果您设置 teardown=False,这会使浏览器保持打开状态:

class ItsyBitsy(object):
    def __init__(self, teardown=False):
        self.teardown = teardown
        self.targets_a = dict() # data like url:document_summary 
                                # filled by another function
        self.browser = webdriver.Safari()


    def visit_targets_a(self):

        for url in self.targets_a.keys():
            try:
                self.browser.switch_to.new_window('tab')
                self.browser.get(url)
                time.sleep(2)

            except Exception as e:
                print(f'{url} FAILED: {e}')
                continue

            # do some automation stuff

            time.sleep(2)

        print('All done!')

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.teardown:
            self.browser.quit()

spider = ItsyBitsy(teardown=False)
spider.visit_targets_a()