Home > Software engineering >  How to avoid selenium driver closing automatically?
How to avoid selenium driver closing automatically?

Time:05-03

Before my question, it might be helpful to show you the general structure of my code:

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!')

I can then instantiate the class and call my method without any issues:

spider = ItsyBitsy()
spider.visit_targets_a()


>>> All done!

However after every tab is opened and automations are completed, the window closes without any prompt even though I do not have browser.close() or browser.exit() anywhere in my code.

My band-aid fix is calling time.sleep(9999999999999999) on the last loop, which keeps the window open indefinitely due to the Overflow Error, but it is obviously not a solution.

So, how do I stop the browser from exiting?!

Bonus points if you can educate me on why this is happening.

Thanks guys/gals!

CodePudding user response:

Are you using VS Code? Half year ago I had the same problem and switching to Sublime text fixed this. This problem appers because VS Code has a bit wierd way to run python code (via extension) - it kills all processes which were created by the script when the last line of code has been excecuted.

CodePudding user response:

You need to override exit and prevent 'browser.quit()' from automatically happening.

This keeps the browser open if you set 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()
  • Related