谈谈Selenium中浏览器驱动的日志

谈谈,selenium,浏览器,驱动,日志 · 浏览次数 : 314

小编点评

# Geckodriver Status Report **Starting Gecko Driver** **Version:** 0.30.0 **Logging Level:** DEBUG **Starting at Port:** 4444 **Connecting to Gecko Server:** 127.0.0.1:4444 **Starting Gecko Session:** **Dynamically Enabled Window Occlusion (0.000)** **Log Level:** DEBUG **Starting with Arguments:** --log fatal **Starting ChromeDriver** **C:\Users\xxx>geckodriver --helpgeckodriver 0.30.0 (d372710b98a6 2021-09-16 10:29 +0300)** **Starting ChromeDriver with Arguments:** --log fatal --marionette-host 127.0.0.1 --marionette-port 4444 --host 127.0.0.1 --port 4444 --websocket-port 9222 --log **Starting ChromeDriver with Arguments:** --log fatal --marionette-host 127.0.0.1 --marionette-port 4444 --host 127.0.0.1 --port 4444 --websocket-port 9222 --log **Ending ChromeDriver** **C:\Users\xxx>geckodriver --helpgeckodriver 0.30.0 (d372710b98a6 2021-09-16 10:29 +0300)**

正文

谈谈Selenium中浏览器驱动的日志

  • 来源于一位同学,“老师为啥firefox执行后会有日志文件,chrome没有呢?”

比对

  • 你打开chrome浏览器

    from selenium import webdriver
    driver = webdriver.Chrome()
    
  • 这样是没有日志的

  • 同样的代码,你打开firefox

    from selenium import webdriver
    driver = webdriver.Firefox()
    
  • 就会有个日志文件geckodriver.log生成,默认在你上面代码所在目录

  • 内容大致如下

    1678943199197	geckodriver	INFO	Listening on 127.0.0.1:8695
    1678943202290	mozrunner::runner	INFO	Running command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "--marionette" "--remote-debugging-port" "8696" "-no-remote" "-profile" "C:\\Users\\SONGQI~1\\AppData\\Local\\Temp\\rust_mozprofileNtWGR9"
    1678943202558	Marionette	INFO	Marionette enabled
    Dynamically enable window occlusion 0
    1678943202562	Marionette	INFO	Listening on port 8705
    WebDriver BiDi listening on ws://127.0.0.1:8696
    1678943202947	RemoteAgent	WARN	TLS certificate errors will be ignored for this session
    console.warn: SearchSettings: "get: No settings file exists, new profile?" (new NotFoundError("Could not open the file at C:\\Users\\SONGQI~1\\AppData\\Local\\Temp\\rust_mozprofileNtWGR9\\search.json.mozlz4", (void 0)))
    DevTools listening on ws://127.0.0.1:8696/devtools/browser/791df03a-8db6-429b-969a-32cd077b3c2f
    
    
  • 的确是这样的,chrome和firefox2个浏览器在selenium中的api都是有差异的

  • 下面的代码可以让你看到2者独有的那些api

    from selenium import webdriver
    driver1 = webdriver.Chrome()
    driver2 = webdriver.Firefox()
    set_of_chrome_api = set([_ for _ in dir(driver1) if _[0]!='_'])
    set_of_firefox_api = set([_ for _ in dir(driver2) if _[0]!='_'])
    print('firefox特有的:',(set_of_chrome_api|set_of_firefox_api)-set_of_chrome_api)
    print('-------------')
    print('chrome特有的:',(set_of_chrome_api|set_of_firefox_api)-set_of_firefox_api)
    

让chrome也有日志

  • 首先来看下Chrome这个类的初始化参数都有哪些

    # selenium\webdriver\chrome\webdriver.py
    class WebDriver(ChromiumDriver):
        def __init__(self, executable_path=DEFAULT_EXECUTABLE_PATH, port=DEFAULT_PORT,
                     options: Options = None, service_args=None,
                     desired_capabilities=None, service_log_path=DEFAULT_SERVICE_LOG_PATH,
                     chrome_options=None, service: Service = None, keep_alive=DEFAULT_KEEP_ALIVE):
    
  • 你应该一眼就看到有日志相关的参数了service_log_path

  • 有个默认值DEFAULT_SERVICE_LOG_PATH

  • 往上能看到定义:DEFAULT_SERVICE_LOG_PATH = None

  • 所以chrome就没有日志了

  • 要有就简单了,给一个值就行了,这样

    from selenium import webdriver
    driver = webdriver.Chrome(service_log_path='chrome.log')
    
  • 妥妥的在当前目录下生成了一个chrome.log文件里面也记录着本次操作的日志

  • 多说几句,默认的日志就记录到INFO/WARN这样的级别

  • 如果要加DEBUG的信息,可以这样

    from selenium import webdriver
    driver = webdriver.Chrome(service_args=['--verbose'],
                              service_log_path='chrome.log')
    
    

让firefox没有日志,没那么简单

  • 循着刚才的思路,让firefox没有日志似乎就很简单了

  • 依葫芦画瓢,找到Firefox的定义

    # selenium\webdriver\firefox\webdriver.py
    # 注意,此处的路径跟上面的chrome的并不一样
    class WebDriver(RemoteWebDriver):
        def __init__(self, firefox_profile=None, firefox_binary=None,
                     capabilities=None, proxy=None,
                     executable_path=DEFAULT_EXECUTABLE_PATH, options=None,
                     service_log_path=DEFAULT_SERVICE_LOG_PATH,
                     service_args=None, service=None, desired_capabilities=None,
                     log_path=DEFAULT_LOG_PATH, keep_alive=True):
    
  • 看到了参数service_log_path,一样也有默认值DEFAULT_SERVICE_LOG_PATH

  • 找到定义处,DEFAULT_SERVICE_LOG_PATH = "geckodriver.log"

  • 改为None试试

    from selenium import webdriver
    driver = webdriver.Firefox(service_log_path=None)
    
  • 效果有,但又有点不对

  • 控制台冒出了很多信息

    demo_log.py:2: DeprecationWarning: service_log_path has been deprecated, please pass in a Service object
      driver = webdriver.Firefox(service_log_path=None)
    1678944678241	geckodriver	INFO	Listening on 127.0.0.1:10729
    1678944681310	mozrunner::runner	INFO	Running command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "--marionette" "--remote-debugging-port" "10730" "-no-remote" "-profile" "C:\\Users\\SONGQI~1\\AppData\\Local\\Temp\\rust_mozprofileeEN3y9"
    Dynamically enable window occlusion 0
    1678944681583	Marionette	INFO	Marionette enabled
    1678944681587	Marionette	INFO	Listening on port 10743
    WebDriver BiDi listening on ws://127.0.0.1:10730
    1678944681883	RemoteAgent	WARN	TLS certificate errors will be ignored for this session
    console.warn: SearchSettings: "get: No settings file exists, new profile?" (new NotFoundError("Could not open the file at C:\\Users\\SONGQI~1\\AppData\\Local\\Temp\\rust_mozprofileeEN3y9\\search.json.mozlz4", (void 0)))
    DevTools listening on ws://127.0.0.1:10730/devtools/browser/a4f3a501-e642-4540-8998-ae1ea0b3abc5
    
  • 仔细一看,跟之前在geckodriver.log中打印的类似

  • 还多了一句

    DeprecationWarning: service_log_path has been deprecated, please pass in a Service object
    
  • 原来service_log_path被弃用了,需要传递一个Service对象

  • 怎么传递Service对象呢?找到其定义,注意路径

  • 有多个Service在selenium这个库中,你要的是firefox下的

    #  selenium\webdriver\firefox\service.py
    class Service(service.Service):
        """Object that manages the starting and stopping of the
        GeckoDriver."""
    
        def __init__(self, executable_path: str = DEFAULT_EXECUTABLE_PATH,
                     port: int = 0, service_args: List[str] = None,
                     log_path: str = "geckodriver.log", env: dict = None):
    
  • 可以看到,这里有个参数log_path,其默认值是"geckodriver.log"

  • 那我们就可以这样修改了

    from selenium import webdriver
    from selenium.webdriver.firefox.service import Service
    # 听你的,传递一个Service对象
    # Service(log_path='') 就是一个
    driver = webdriver.Firefox(service=Service(log_path=''))
    
  • 至此DeprecationWarning: service_log_path has been deprecated, please pass in a Service object的这段没了

  • 不过下面的1678945260755 geckodriver INFO Listening on 127.0.0.1:11634,这样的仍然存在的

  • 而这部分实际是geckodriver这个驱动的打印信息

    C:\Users\xxx>geckodriver
    1678945567307   geckodriver     INFO    Listening on 127.0.0.1:4444
    
  • 如果要去掉,就是让geckodriver这个程序静默

  • 没有找到太好的办法,geckodriver的帮助如下

    C:\Users\xxx>geckodriver --help
    geckodriver 0.30.0 (d372710b98a6 2021-09-16 10:29 +0300)
    WebDriver implementation for Firefox
    
    USAGE:
        geckodriver [FLAGS] [OPTIONS]
    
    FLAGS:
            --connect-existing    Connect to an existing Firefox instance
        -h, --help                Prints this message
            --jsdebugger          Attach browser toolbox debugger for Firefox
        -v                        Log level verbosity (-v for debug and -vv for trace level)
        -V, --version             Prints version and copying information
    
    OPTIONS:
            --android-storage <ANDROID_STORAGE>    Selects storage location to be used for test data (deprecated). [possible
                                                   values: auto, app, internal, sdcard]
        -b, --binary <BINARY>                      Path to the Firefox binary
            --log <LEVEL>                          Set Gecko log level [possible values: fatal, error, warn, info, config,
                                                   debug, trace]
            --marionette-host <HOST>               Host to use to connect to Gecko [default: 127.0.0.1]
            --marionette-port <PORT>               Port to use to connect to Gecko [default: system-allocated port]
            --host <HOST>                          Host IP to use for WebDriver server [default: 127.0.0.1]
        -p, --port <PORT>                          Port to use for WebDriver server [default: 4444]
            --websocket-port <PORT>                Port to use to connect to WebDriver BiDi [default: 9222]
    
  • --log 这个参数可以让它控制输出级别

  • 最终我们可以这样写

    from selenium import webdriver
    from selenium.webdriver.firefox.service import Service
    
    driver = webdriver.Firefox(service=Service(log_path='',
                        service_args=['--log','fatal']))  # 你不能 ['--log fatal'] 会报错
    
    
  • 然,即便如此,控制台一样有打印

    Dynamically enable window occlusion 0
    WebDriver BiDi listening on ws://127.0.0.1:12166
    console.warn: SearchSettings: "get: No settings file exists, new profile?" (new NotFoundError("Could not open the file at C:\\Users\\SONGQI~1\\AppData\\Local\\Temp\\rust_mozprofiledrxhm5\\search.json.mozlz4", (void 0)))
    DevTools listening on ws://127.0.0.1:12166/devtools/browser/22a37523-84bc-4bd6-a5e9-79c30825d1e8
    
  • 啊~~~~~~~~~无语了,不弄了,放弃了,干点有意义的事情吧,有点无趣

与谈谈Selenium中浏览器驱动的日志相似的内容:

谈谈Selenium中浏览器驱动的日志

谈谈Selenium中浏览器驱动的日志 来源于一位同学,“老师为啥firefox执行后会有日志文件,chrome没有呢?” 比对 你打开chrome浏览器 from selenium import webdriver driver = webdriver.Chrome() 这样是没有日志的 同样的代

谈谈Selenium中的三种切换之alert

谈谈Selenium中的三种切换之alert 一、如何识别 识别方法:alert中的确定、取消、输入框无法用inspector定位到,当然还有一些特例。 alert分为三种 alert confirm prompt 分别对应3个js的命令(可在chrome的console面板中调试) alert('

谈谈为什么要分库分表?

由于数据库的承载能力是有限的,当业务增长量达到一定规模后,数据库的性能就会达到瓶颈。于是产生了分库分表的解决方案,本文将详细讲解什么是分库分表,以及分库分表的原因和可能产生的问题。

谈谈 JVM 垃圾回收机制

前言 垃圾回收需要思考三件事情,哪些内存需要回收?什么时候回收?如何回收? 一、哪些内存需要回收 JVM 的内存区域中,程序计数器、虚拟机栈和本地方法栈的生命周期是随线程而生,随线程而灭的。这几个区域的内存分配和回收都具有确定性,不需要过多考虑回收问题,当方法或线程结束时,内存自然就跟着回收了。 J

谈谈 Spring 的过滤器和拦截器

我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。

谈谈分布式事务原理

分布式系统中,不同服务之间的交互可能会出现各种问题,如网络、异常等,可能会导致服务间的数据产生不一致的情况,如何避免?本文将详细讲述分布式事务的原理和解决方案。

[转帖]谈谈Service与Ingress

https://zhuanlan.zhihu.com/p/596889677 你好,我是张磊。今天我和你分享的主题是:谈谈Service与Ingress。 在上一篇文章中,我为你详细讲解了将Service暴露给外界的三种方法。其中有一个叫作LoadBalancer类型的Service,它会为你在Cl

[转帖]谈谈对K8S CNI、CRI和CSI插件的理解

K8S的设计初衷就是支持可插拔架构,解决PaaS平台不好用、不能用、需要定制化等问题,K8S集成了插件、附加组件、服务和接口来扩展平台的核心功能。附加组件被定义为与环境的其他部分无缝集成的组件,提供类似本机的特性,并扩展集群管理员可用的组件,扩展还可以用于添加自定义软硬件的支持;服务和接口提供了看似

[转帖]谈谈ClickHouse性能情况以及相关优化

https://zhuanlan.zhihu.com/p/349105024 ClickHouse性能情况 主要分为4个方面 1、单个查询吞吐量 场景一: 如果数据被放置在page cache中,则一个不太复杂的查询在单个服务器上大约能够以2-10GB/s(未压缩)的速度进行处理(对于简单的查询,速

谈谈JSF业务线程池的大小配置

本文旨在通过一个简化场景(“单服务应用”)下的负载测试,为“JSF业务线程池大小配置”提供基准测试结果,并形成一些普遍适用的结论。