更改变量名会影响代码行为

Changing a variable name affects the code behavior

当我运行这段代码时,selenium之一windows没有关闭

import multiprocessing

from selenium import webdriver


class Worker:
    def __init__(self):
        self.driver = webdriver.Chrome()

    def run(self):
        self.driver.get('https://www.google.com')


processes = []
for i in range(2):
    worker = Worker()
    process = multiprocessing.Process(target=worker.run)
    process.start()
    processes.append(process)

for any_name in processes:
    any_name.terminate()

但是如果我将变量名从 any_name 更改为 worker,那么所有 selenium windows 都会关闭。为什么会这样?

PS 版本:python 3.7,chromedriver 83,selenium 3.141.0

这是因为浏览器关闭行为依赖于selenium.webdriver.common.service.Service__del__方法使浏览器Windows退出,而__del__只有在出现时才会被调用不再引用您的 WebDriver 个实例。下面是 Service.__del__:

的实现
    def __del__(self):
        # `subprocess.Popen` doesn't send signal on `__del__`;
        # so we attempt to close the launched process when `__del__`
        # is triggered.
        try:
            self.stop()
        except Exception:
            pass

stop() 方法关闭一切。

现在,变量命名很重要的原因是它会影响程序退出时是否有任何对 WebDriver 的引用。当您的第一个 for 循环完成时,worker 仍在范围内,它包含对您创建的第二个 Worker 的引用,它包含对 WebDriver 的引用。当您的主程序完成时,它会保持在范围内,这意味着 __del__ 永远不会被调用,并且浏览器 window 不会关闭。

但是,当您在第二个 for 循环中重新使用 worker 时,这意味着不再保留对第二个 Worker 的引用,这意味着没有对 [=14] 的引用=] 在内存中,这意味着 __del__ 将被调用并且 window 将关闭。您可以通过在第一个 for 循环之外显式添加 worker = None 来确认此行为。有了这个改变,两个浏览器 windows 总是退出,不管你在第二个循环中使用什么变量名。