使用 Selenium Webdriver 控制 Chrome Devtools

Posted

技术标签:

【中文标题】使用 Selenium Webdriver 控制 Chrome Devtools【英文标题】:Controlling Chrome Devtools with Selenium Webdriver 【发布时间】:2015-12-23 18:51:58 【问题描述】:

我希望通过 Selenium Webdriver 访问/使用 Chrome 的开发工具面板。

具体来说,我想使用通过 devtools 访问的“WASP”chrome 插件。我已经将我的 selenium 设置为使用包含的 WASP 插件运行,并且我可以打开 DevTools(使用 sendKeys.F12),但现在我不知道如何实际使用该面板,因为它已打开。有办法吗?

我发现最接近我的问题的是这个链接:Chrome Dev Tools API & Selenium WebDriver,但这对我一点帮助都没有。

另外,如果这看起来是不可能的(确实如此),任何人都可以想到一个解决方法吗?

【问题讨论】:

WebDriver 用于驱动浏览器并与网页交互。除了键盘快捷键之外,它不会控制开发工具。 Chrome 扩展程序也是一个“网页”,其地址类似于 chrome-extension://some_gibrish/some_name.html 和一些执行某些操作的 JS。您可以从开发人员工具中监视实际 URL(扩展扩展名>右键单击检查>...)所以理论上您可以将该扩展名“注入”到您的页面上并使其运行其 JS 脚本...看起来很多工作,并且非常具体到每个扩展。 【参考方案1】:

在 Selenium 4 alpha 中,有一种方法可以使用 java-client 与 DevTools API 进行交互。您正在寻找的是“Profiler”域 (https://chromedevtools.github.io/devtools-protocol/tot/Profiler)

最近,我贡献了“网络”和“性能”域,以便在 selenium java 中更好地面向用户的 API - https://github.com/SeleniumHQ/selenium/pull/7212

相信“Profiler”也将很快实施。当然,前段时间合并的 Java 客户端有一个通用的所有域的 API,你可以这样使用它:

     driver.getDevTools().createSession();

    driver.getDevTools().send(new Command("Profiler.enable", ImmutableMap.of()));
    driver.getDevTools().send(new Command("Profiler.start", ImmutableMap.of()));

    //register to profiler events
    driver.getDevTools().addListener(new Event("Profiler.consoleProfileStarted", ConsoleProfileStarted.class), new Consumer<Object>() 
        @Override
        public void accept(Object o) 
            //do something
        
    );

在将 Profiler 域添加到 Selenium java 客户端之前,您必须提供 Mapper。

【讨论】:

以上是关于使用 Selenium Webdriver 控制 Chrome Devtools的主要内容,如果未能解决你的问题,请参考以下文章

Selenium+WebDriver+Python 定时控制任务

多线程 Selenium WebDriver 与 Selenium Grid

selenium_webdriver(python)控制浏览器滚动条

java+selenium webdriver怎么实现数据参数化

Python + Selenium常用控制方法

在发送密钥和控制台之后获取输入值,记录值Selenium Webdriver