Selenium python 与 selenium 使用 chrome 浏览器 在函数内调用该函数,执行完成后浏览器会自动关闭

时光走散了故人。 · 2019年07月24日 · 最后由 王_test 回复于 2020年02月15日 · 2868 次阅读

1.使用线性脚本执行没有任何问题
2.将同样的代码写在方法内,调用该方法,程序执行完成后浏览器会自动关闭
from selenium import webdriver

dr = webdriver.Chrome()
dr.get("https://www.baidu.com/")
dr.find_element_by_id('kw').click()
dr.find_element_by_id('kw').clear()
dr.find_element_by_id('kw').send_keys('刘德华')
dr.find_element_by_id('su').click()
def get():
    dr = webdriver.Chrome()
    dr.get("https://www.baidu.com/")
    dr.find_element_by_id('kw').click()
    dr.find_element_by_id('kw').clear()
    dr.find_element_by_id('kw').send_keys('刘德华')
    dr.find_element_by_id('su').click()

get()

问题来源:http://bbs.51testing.com/forum.php?mod=viewthread&tid=1196271&ordertype=2

今天碰到了同样的问题,百思不得其解,之前都没遇到这种问题,有大神知道这是为什么嘛

最佳回复
from logzero import logger
class A:
    def __del__(self):
        logger.debug("A#__del__ called")

class B:
    def __init__(self):
        self.a=A()

def func():
    B()

func()

输出A#__del__ called,就是这么设计的;
Se,它的代码类似如上代码 (大概是委托还是什么),

在贴主的示例代码中,get() 调用时,触发了
selenium/webdriver/common/service.pyService#__del__ 方法
Service#__del__调用了 同类中的 Service#stop 方法,
Service#stop 调用了 同类中的 Service#send_remote_shutdown_command方法,
Service#send_remote_shutdown_command 中的
url_request.urlopen("%s/shutdown" % self.service_url)
导致浏览器关闭

共收到 8 条回复 时间 点赞

是不是因为方法调用结束后,会自动释放内存,所以导致浏览器自动关闭呢?

大概是的吧

from logzero import logger
class A:
    def __del__(self):
        logger.debug("A#__del__ called")

class B:
    def __init__(self):
        self.a=A()

def func():
    B()

func()

输出A#__del__ called,就是这么设计的;
Se,它的代码类似如上代码 (大概是委托还是什么),

在贴主的示例代码中,get() 调用时,触发了
selenium/webdriver/common/service.pyService#__del__ 方法
Service#__del__调用了 同类中的 Service#stop 方法,
Service#stop 调用了 同类中的 Service#send_remote_shutdown_command方法,
Service#send_remote_shutdown_command 中的
url_request.urlopen("%s/shutdown" % self.service_url)
导致浏览器关闭

解决方法可以把 dr = webdriver.Chrome() 放在函数体之外,这样就不会自动关闭了。然后执行 dr.quit() 关闭浏览器进程。

hellohell 回复

首先非常感谢您的回复,但是还是看的有点懵,能否告知下,您是如何查看 get() 调用的整个过程呢?我用 pychame 断点在 get() 后,还是无法看出您说的这个调用链,麻烦指导下,非常感谢

Francis 回复

是的,这个方法可以解决这个问题。但是如果做测试固件分离的话,按照您这种思路总感觉怪怪的。市面上大部分固件分离的方式,都是把 webdriver 的实例化放在init方法中,比如:https://www.cnblogs.com/manma/p/11052022.html
但这样也会导致浏览器自动关闭的结果

这个只能找懂得 Py 实现的人来解释,Py 也只是一种规范,说到底最后也要变成高低电流让硬件识别。我的水平不成,只是举了个定性的例子,大概可以判断局部作用域结束后,会对局部作用域中的对象进行类似 del的操作。但是 版本不同,实现不同 (你总不能把 Cpython 上测试出的结果,直接硬推到 Jython 上,不试试就说它也是这么做的), 另外,例子的代码太短,如果上千行的程序,是执行完就del吗?,我没法回答。 这是垃圾回收导致的吗?回收就会导致执行类似del的操作吗?这里藏着好多问题。
此外我不用 Pycharm, 我也怀疑 PYcharm 看不到这些魔法方法的实现。

Francis 回复

但是我有一个场景,需要在循环里打开多个浏览器然后起,如果放函数体外的话就不行了把。。而且也是会等超过 10 个后就会自动关闭。。怎么办啊

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册