利用 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浏览器 来做示例。
整个下来主要有两个步骤,
在 chrome浏览器的地址栏中输入 chrome://version,如下图所示

C:\Program Files\Google\Chrome\Application\chrome.exe 这个是chrome 可执行路径。mark下来有用。
在cmd命令行窗口输入以下指令
9527,存放文件配置路径在F:\selenium(会自动创建)start chrome --remote-debugging-port=9527 --user-data-dir="F:\selenium"
看以下动图

在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命令,效果基本上是一致的。想选用哪个就先实践一番,再做决定吧~
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"')
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"')
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"')
这里我们来看看,怎么通过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}/json | http://localhost:64829/json | 查看当前窗口的页面连接 |
http://{localhost:port}/json/version | http://localhost:64829/json/version | 查看窗口远程链接 |
访问 http://localhost:64829/json/,如下图所示,

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

接下来使用浏览器访问该Url: http://localhost:64829/json/version ,如下图所示
webSocketDebuggerUrl(调试器Url),是远程链接的地址,若使用 puppeteer的话能用到
代码 :
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和运行其它逻辑(如果有的话~)

调用我的代码,直接运行即可控制当前浏览器窗口。
自己动手操作一番,岂不美哉?
See you🎈🎈
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption