在没有对象引用的情况下杀死Webdriver实例

时间:2019-01-07 04:19:48

标签: python selenium

如果我运行以下命令,则会有一个时间窗口,我可以发送Optional.ofNullable(words[5]).ifPresent(a -> System.out.println(a.toLowerCase())).orElse();// doesn't work``` ,以便Firefox实例都打开 SIGINT并没有定义。

self.firefox

大概是因为硒启动浏览器和返回参考之间发生了中断。

虽然较小,但在运行无头测试时,错误时间的中断可能会使FF实例处于打开状态,而没有引用。有没有一种方法可以识别和管理由Selenium启动的Firefox实例,而又不会杀死用户在计算机上运行的任何正常Firefox实例?

2 个答案:

答案 0 :(得分:0)

确切地说,有人已经回答了如何停止geckodriver实例: [https://stackoverflow.com/a/48003289/6892765][1]

现在回到中断发生时如何使用它。 在运行测试时,必须使用诸如pytest之类的测试引擎,该引擎具有处理此类中断的功能。

专门用于pytest引擎: 在conftest.py文件中实现pytest_exception_interact,当引发异常时可以调用该文件,该异常可以交互处理。

def pytest_exception_interact(node, call, report):
    # Your code to perform geckodriver instance killing

答案 1 :(得分:0)

我尝试了几件事,最终根据学习者8269提出的解决方案提出了一个解决方案。如他在我的系统上的评论中所述,Windows 10 /当前Geckodriver实例无法与正常的Firefox进程区分开。结果,我最终用try catch语句和以下代码包装了对象创建:

from subprocess import check_output
from selenium import webdriver
import re

tasklist = check_output(["tasklist", "/fi", "imagename eq firefox.exe"], shell=True).decode()
currentFFIDs = re.findall(r"firefox.exe\s+(\d+)", tasklist)
try:
    firefox = webdriver.Firefox()
except:
    tasklist = check_output(["tasklist", "/fi", "imagename eq firefox.exe"], shell=True).decode()
    firefoxIds = set(re.findall(r"firefox.exe\s+(\d+)", tasklist)).difference(currentFFIDs)
    taskkill = 'taskkill /f '+''.join(["/pid "+f+" " for f in firefoxIds]).strip()
    check_output(taskkill.split(), shell=True)
    print("\nFirefox was force closed\n", flush=True)

这是什么:

  • 获取用于运行Firefox实例的当前进程ID
  • 这是通过subprocesstasklist中调用cmd命令并使用正则表达式提取进程ID列来完成的。
  • 尝试启动webdriver实例;如果成功,那就好,否则运行tasklist并获取一组新的进程ID
    • 这现在可能包含由Selenium开头的ID
  • 将新ID转换为集合并从中删除所有原始ID
  • 调用“ taskkill”并提供在第一个tasklist过程之后创建的所有新的Firefox ID;然后将终止所有无头的Firefox实例。