鱼C论坛

 找回密码
 立即注册
查看: 2663|回复: 8

[已解决]selenium连接已经打开的浏览器,网页刷新之后,就再也连不上了,只能从新打开浏览器

[复制链接]
发表于 2023-5-10 16:28:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
selenium连接已经打开的浏览器,网页刷新之后,就再也连不上了,只能从新打开浏览器,这种情况怎么解决
最佳答案
2023-5-10 16:45:51
halemorning 发表于 2023-5-10 16:37
大佬,我想在不关闭浏览器的前提下,重新连接上,刷新网页后,第一种方法不太懂

我明白你的需求了。在Selenium中,一旦你的浏览器页面刷新或者导航到其他页面,你的Selenium实例依然与浏览器保持连接,所以理论上不需要重新连接。但如果你遇到了问题,可能是因为某些元素或者状态在刷新后已经不再存在。

对于你提到的第一种方法,让我解释一下: driver.switch_to.window(window_name) 这个方法是用来在多个窗口之间进行切换的。在这里, window_name 是你要切换到的窗口的名字。你可以通过 driver.window_handles 来获取当前所有打开的窗口的句柄,然后在这些窗口之间切换。举个例子,如果你想切换到第一个打开的窗口,你可以这样做:
driver.switch_to.window(driver.window_handles[0])

然而,如果你只是在同一个窗口里刷新了页面,你其实不需要进行窗口切换。刷新页面可能会导致一些元素无法找到,这时你需要重新定位这些元素。

如果你的问题是关于重新连接已打开的浏览器,Selenium在设计上没有提供这个功能。Selenium的WebDriver是设计用来控制一个新的浏览器会话的,它并不支持连接到一个已经存在的浏览器会话。如果你关闭了你的Python脚本但浏览器仍然打开,那么你的Selenium会话会丢失,你不能重新连接到那个会话。

如果你的需求是在浏览器刷新后继续操作,你可以在刷新后重新定位你需要的元素并进行操作。你可能需要使用 time.sleep() 或者WebDriverWait来等待页面加载完成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-10 16:29:11 | 显示全部楼层
这种情况可能是因为浏览器会话被关闭或者被重置。可以尝试以下方法解决:

1. 使用 driver.switch_to.window(window_name) 方法切换到原始窗口,这样就可以继续使用原始窗口进行操作。

2. 如果原始窗口已经关闭,可以使用 driver.window_handles 方法获取所有窗口句柄,然后切换到需要的窗口。

3. 如果以上方法都无法解决问题,可以尝试使用 driver.quit() 方法关闭浏览器会话,然后重新打开浏览器并连接到原始窗口。

希望以上方法能够帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 16:37:04 | 显示全部楼层
isdkz 发表于 2023-5-10 16:29
这种情况可能是因为浏览器会话被关闭或者被重置。可以尝试以下方法解决:

1. 使用 driver.switch_to.windo ...

大佬,我想在不关闭浏览器的前提下,重新连接上,刷新网页后,第一种方法不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 16:45:51 | 显示全部楼层    本楼为最佳答案   
halemorning 发表于 2023-5-10 16:37
大佬,我想在不关闭浏览器的前提下,重新连接上,刷新网页后,第一种方法不太懂

我明白你的需求了。在Selenium中,一旦你的浏览器页面刷新或者导航到其他页面,你的Selenium实例依然与浏览器保持连接,所以理论上不需要重新连接。但如果你遇到了问题,可能是因为某些元素或者状态在刷新后已经不再存在。

对于你提到的第一种方法,让我解释一下: driver.switch_to.window(window_name) 这个方法是用来在多个窗口之间进行切换的。在这里, window_name 是你要切换到的窗口的名字。你可以通过 driver.window_handles 来获取当前所有打开的窗口的句柄,然后在这些窗口之间切换。举个例子,如果你想切换到第一个打开的窗口,你可以这样做:
driver.switch_to.window(driver.window_handles[0])

然而,如果你只是在同一个窗口里刷新了页面,你其实不需要进行窗口切换。刷新页面可能会导致一些元素无法找到,这时你需要重新定位这些元素。

如果你的问题是关于重新连接已打开的浏览器,Selenium在设计上没有提供这个功能。Selenium的WebDriver是设计用来控制一个新的浏览器会话的,它并不支持连接到一个已经存在的浏览器会话。如果你关闭了你的Python脚本但浏览器仍然打开,那么你的Selenium会话会丢失,你不能重新连接到那个会话。

如果你的需求是在浏览器刷新后继续操作,你可以在刷新后重新定位你需要的元素并进行操作。你可能需要使用 time.sleep() 或者WebDriverWait来等待页面加载完成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 16:55:12 | 显示全部楼层
isdkz 发表于 2023-5-10 16:45
我明白你的需求了。在Selenium中,一旦你的浏览器页面刷新或者导航到其他页面,你的Selenium实例依然与浏 ...

我明白了,大佬,如果判断一个字符串在网页源码中出现的次数 ,应该怎么写呢
if '字符串' in driver.page_source:
我现在只会判断是否出现,不会找出现的次数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 16:57:23 | 显示全部楼层
halemorning 发表于 2023-5-10 16:55
我明白了,大佬,如果判断一个字符串在网页源码中出现的次数 ,应该怎么写呢
if '字符串' in driver.pag ...

你可以使用Python的  count()  函数来计算字符串在网页源码中出现的次数。这个函数会返回指定子字符串在字符串中出现的次数。下面是一个例子:
source = driver.page_source
count = source.count('你的字符串')
print(count)

这段代码会打印出 '你的字符串' 在网页源码中出现的次数。记得把 '你的字符串' 替换成你要搜索的实际字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 17:20:50 | 显示全部楼层
isdkz 发表于 2023-5-10 16:57
你可以使用Python的  count()  函数来计算字符串在网页源码中出现的次数。这个函数会返回指定子字符串在 ...

比如说一个代码 隔指定时间运行,而且在这个时间内还不影响其余代码执行,应该用什么,举例来说 技能1CD是10秒,想每隔10秒重复执行,但是在这10秒内还想执行别的技能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 17:25:17 | 显示全部楼层
halemorning 发表于 2023-5-10 17:20
比如说一个代码 隔指定时间运行,而且在这个时间内还不影响其余代码执行,应该用什么,举例来说 技能1CD ...

你可以使用 Python 的多线程或者异步编程来解决这个问题。

举个例子,你可以使用  threading  模块来创建一个新的线程来执行你的技能1,这样主线程就可以在技能1执行的同时执行其他任务。以下是一个简单的示例:
import threading
import time

def skill1():
    while True:
        print('技能1执行')
        time.sleep(10)  # 休眠10秒

def other_skills():
    # 执行其他技能的代码
    pass

# 创建并启动技能1的线程
t1 = threading.Thread(target=skill1)
t1.start()

# 在主线程中执行其他技能
other_skills()

在这个例子中, skill1  函数会在一个新的线程中无限循环执行,每次执行后休眠10秒。 other_skills  函数则会在主线程中执行。

需要注意的是,Python 的多线程并不适合执行计算密集型任务,因为 GIL(Global Interpreter Lock)的存在会导致即使在多核 CPU 上,Python 也只能同时执行一个线程。如果你的技能1或其他技能是计算密集型的,那么可能需要使用多进程( multiprocessing  模块)或者异步编程( asyncio  模块)。

另外,不管是多线程还是多进程,都需要注意线程安全或进程安全的问题,确保在多个线程或进程之间正确地共享和操作数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-12 09:00:05 | 显示全部楼层
感激分享,认真学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 07:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表