Selenium控制当前已经打开的 chrome浏览器窗口(高级版)

Posted 是小菜欸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium控制当前已经打开的 chrome浏览器窗口(高级版)相关的知识,希望对你有一定的参考价值。

前言

利用 Selenium 获取已经打开的浏览器窗口,全python操作

标题链接
【Selenium】控制当前已经打开的 chrome浏览器窗口https://blog.csdn.net/weixin_45081575/article/details/112621581
【Selenium】控制当前已经打开的 chrome浏览器窗口(高级篇)https://blog.csdn.net/weixin_45081575/article/details/126389273

不同的是,本次全是用python来进行操作,省去了手动打开浏览器的操作,也相当于是节省了一点点功夫。与上一篇有异曲同工之妙。

这里使用 chrome浏览器 来做示例。

整个下来主要有两个步骤,

  1. 手动打开浏览器,
  2. 使用 Python程序 去获取到手动打开的 chrome浏览器

应用场景(理论上)

  1. 登录账号并且需要输入手机验证码的网站;
  2. 登录账号并且需要人机验证的网站(如图片点选、文字点选等人机验证;

1. 查看浏览器信息

在 chrome浏览器的地址栏中输入 chrome://version,如下图所示

C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe 这个是chrome 可执行路径。mark下来有用。

2. 代码释义

在cmd命令行窗口输入以下指令

  • start chrome:从命令行启动 chrome 应用程序
  • 释义:以调试模式打开浏览器,端口为9527,存放文件配置路径在F:\\selenium(会自动创建)
start chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"

看以下动图

3. Python执行cmd命令

在Python的内置库中,os 和 subprocess 可以执行cmd命令(还有其它的,暂不表)

下面来展示他们的用法。

os模块是Python 自带的一个操作系统接口模块,详见 OS模块介绍

在这里主要用到它的 os.popen 命令,

代码如下

  • 使用os.popen即可执行cmd命令~(os.popen包装了sunprocess.Popen方法)
import os
os.popen('start chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')

看以下动图~

以下代码都可以调用cmd命令,效果基本上是一致的。想选用哪个就先实践一番,再做决定吧~

os.popen

import os

# 方法一
os.popen(r'start chrome.exe --remote-debugging-port=9527 --user-data-dir="F:\\selenium\\"')

# 方法二
# 先切换到chrome的可执行文件路径,再执行cmd命令。注意这里没有 start
os.chdir(r"C:\\Program Files\\Google\\Chrome\\Application")
os.popen('chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')

os.system

import os

# 方法一
os.system(r'start chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')

# 方法二
# 先切换到chrome的可执行文件路径,再执行cmd命令。注意这里没有 start
os.chdir(r"C:\\Program Files\\Google\\Chrome\\Application")
os.system(r'chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')

subprocess.Popen

import os
import subprocess

# 先切换到chrome可执行文件的路径
os.chdir(r"C:\\Program Files\\Google\\Chrome\\Application")
# 然后使用Popen执行cmd命令,这里的chrome.exe 可替换为 chrome,注意这里没有 start
subprocess.Popen('chrome.exe --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')

4. Selenium的一些基础

这里我们来看看,怎么通过Selenium去接管已经打开的 chrome。
这些都是基于 Chrome DevTools Protocol,感兴趣的可以深入去学习了解。


示例代码

from selenium import webdriver

if __name__ == '__main__':
    browser = webdriver.Chrome()
    browser.get('https://www.csdn.net/')
    # 获取远程链接的地址
    print('remote_url:', browser.caps['goog:chromeOptions']['debuggerAddress'])
    print('session_id:', browser.session_id)
    print(browser.title)

用调试模式执行以上代码,看到下图

  • 'debuggerAddress': 'localhost:64829' ,,,这是关键所在,贯穿全文。

其中,需要关心的是 debuggerAddress 参数,将它填充到下面的Url

  • 注意填充的内容需要是你当前 Selenium 的 localhost:port,不是我这个!!!
填充前填充后作用(表达可能有误,但大体如此)
http://localhost:port/jsonhttp://localhost:64829/json查看当前窗口的页面连接
http://localhost:port/json/versionhttp://localhost:64829/json/version查看窗口远程链接

远程调试

访问 http://localhost:64829/json/,如下图所示,


*****
点击 devtoolsFrontendUrl(开发工具前端Url),可以到调试界面,这个可以用作于远程调试。暂不表~


获取远程链接

接下来使用浏览器访问该Url: http://localhost:64829/json/version ,如下图所示

  • 圈出来的webSocketDebuggerUrl(调试器Url),是远程链接的地址,若使用 puppeteer的话能用到

5. Python程序接管 已打开的浏览器

代码

  • 这里的端口号需要修改成与上面debuggerAddress一致

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 以下代码是使用 Python 接管已经打开的浏览器
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:64829")
browser = webdriver.Chrome(options=options)

browser.get('https://www.bilibili.com/')
print(browser.title)	# 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

代码运行后,可以看到如下:已经将 csdn 修改成 bilibili ,且访问成功了


以上,只是为了说明***(其实不知道说明了什么)
下面将使用 Python去进行上述的全部操作,即控制已经打开的浏览器。

实例

譬如,我这里需要登录CSDN,然后再使用Selenium去接管chrome

代码如下:

  • 中间加入的 input 乃是精髓,直到你完成登录操作后,再去手动触发后面的程序 执行。
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

if __name__ == '__main__':
    os.system(r'start chrome --remote-debugging-port=9527 --user-data-dir="F:\\selenium"')
	
	# 此乃精髓
    input('输入空格继续程序...')
	
    options = Options()
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
    browser = webdriver.Chrome(options=options)

    print(browser.title)
    print()

	# 这里是你的其它逻辑
	"""获取粉丝数量
	   获取所有新增文章
	   获取所有文章的观看数量
	"""

运行之后可以看到,
浏览器窗口请求了新的 URL(https://www.bilibili.com),并且获取到了当前页面的 title和运行其它逻辑(如果有的话~)

6. 总结

调用我的代码,直接运行即可控制当前浏览器窗口。


后话

自己动手操作一番,岂不美哉?
See you🎈🎈

如何通过 Selenium 打开 Chrome 浏览器控制台?

【中文标题】如何通过 Selenium 打开 Chrome 浏览器控制台?【英文标题】:How to open Chrome browser console through Selenium? 【发布时间】:2019-07-02 12:05:03 【问题描述】:

我想通过在 selenium webdriver 中按键盘键 Ctrl+Shift+j 打开 chrome 浏览器控制台。 我可以使用 Robot 类执行此操作,但我希望没有 Robot 类。我已经使用了使用 sendKeys 的 Actions 类和 Keys 类。但我无法打开浏览器控制台。

是chrome浏览器版本问题还是操作系统?为什么浏览器控制台没有使用 Action 类和 Keys 类打开。 ?

【问题讨论】:

Actions.sendKeys 无法做到这一点。正如 Javadoc 所说,它将键发送到活动元素(意味着 DOM 的一个元素)。 Ctrl+Shift+J 是浏览器应用程序的热键。 org.openqa.selenium.interactions.Keyboard.sendKeys 似乎可以处理浏览器密钥,但我从未使用过该功能。 【参考方案1】:

要打开 chrome 浏览器控制台,您可以使用带有 --auto-open-devtools-for-tabs 参数的 ChromeOptions 类,如下所示:

测试配置:

Selenium:Selenium 独立服务器 v3.14.0 ChromeDriver:ChromeDriver 2.46.628402 Chrome:谷歌浏览器 72.0.3626.96

代码块:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class A_Chrome_Browser_Console 

    public static void main(String[] args) 

        System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("start-maximized");
        options.addArguments("--disable-extensions");
        options.addArguments("--auto-open-devtools-for-tabs");
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://www.google.com/");
        System.out.println(driver.getTitle());
    

控制台输出:

Google

浏览器控制台快照:

您可以在Opening inspect (pressing F12) on Chrome via Selenium 中找到基于python 的相关讨论

【讨论】:

谢谢,我试试。 不是控制台,是开发工具。您是如何获得对此投票的? @BVengerov 告诉我screenshot 是否能解决您的困惑 @DebanjanB 默认情况下,“元素”选项卡是打开的,控制台是隐藏的。您可以从答案中的屏幕截图中完美地看到这一点。如果您可以单击“控制台”选项卡打开控制台,那么没有什么可以阻止您在测试中设置断点并通过击键打开它 - 为什么还要费心更改 Chrome 参数。但是,如果您像我一样只有 VNC 处于查看模式,那么这根本没有帮助。 @BVengerov 现在可能只是为了争论,您偏离了原来的反问题。无论打开Elements 选项卡还是Console 选项卡,打开Chrome 浏览器控制台 都有明确的目标。如果您有用例/问题,请随时提出新票。 *** 贡献者将很乐意为您提供帮助。

以上是关于Selenium控制当前已经打开的 chrome浏览器窗口(高级版)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Selenium 打开 Chrome 浏览器控制台?

selenium+java启动Chrome

使用 Selenium Webdriver 控制 Chrome Devtools

手动打开一个chrome网页,想用python+selenium操作这个网页上的控件怎么办

如何在 Python 中使用 Selenium 打开 chrome 开发者控制台?

Selenium用法详解Options选项JAVA爬虫