关于 selenium 通过 JS 脚本的方式打开新窗口提示错误的问题
如何利用selenium且不通过运行js脚本的方式传递url并在新窗口或者标签打开它。
利用window.open(‘url’),运行不了,并且提示
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=51483): Max retries exceeded with url: /session/1f2311de-3086-4a15-be02-e3d6d6308a58/element (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001758103C880>:
Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
写了个小的demo测试,发现都存在这个问题
from selenium import webdriver
driver = webdriver.Ie()
driver.get('http://www.baidu.com')
newwindow = 'window.open("https://www.google.com")'
driver.execute_script(newwindow)
driver.switch_to_window(driver.window_handles[1])
driver.close()
driver.switch_to_window(driver.window_handles[0])
仍旧提示以下错误
Traceback (most recent call last):
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 421, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 416, in _make_request
httplib_response = conn.getresponse()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 1322, in getresponse
response.begin()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 303, in begin
version, status, reason = self._read_status()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 264, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "c:\users\a\appdata\local\programs\python\python38\lib\socket.py", line 669, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "e:\Dropbox\17.Develop\5.Project\autozboa\run.py", line 22, in <module>
manage()
File "e:\Dropbox\17.Develop\5.Project\autozboa\run.py", line 14, in manage
m.handle_doc() # 处理单个文件
File "e:\Dropbox\17.Develop\5.Project\autozboa\manage.py", line 67, in handle_doc
docs_unid = docs.get_docs_unid()
File "e:\Dropbox\17.Develop\5.Project\autozboa\zboa\pages\docs_page.py", line 38, in get_docs_unid
for doc in self.find_elements(*self.docs_link):
File "e:\Dropbox\17.Develop\5.Project\autozboa\zboa\framework\base_page.py", line 70, in find_elements
elements = self.driver.find_elements(*selector)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1005, in find_elements
return self.execute(Command.FIND_ELEMENTS, {
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute
response = self.command_executor.execute(driver_command, params)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 374, in execute
return self._request(command_info[0], url, body=data)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 402, in _request
resp = http.request(method, url, body=body, headers=headers)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\request.py", line 79, in request
return self.request_encode_body(
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\request.py", line 171, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\poolmanager.py", line 330, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 719, in urlopen
retries = retries.increment(
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\util\retry.py", line 400, in increment
raise six.reraise(type(error), error, _stacktrace)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\packages\six.py", line 734, in reraise
raise value.with_traceback(tb)
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 421, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "E:\Dropbox\17.Develop\5.Project\autozboa\env\lib\site-packages\urllib3\connectionpool.py", line 416, in _make_request
httplib_response = conn.getresponse()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 1322, in getresponse
response.begin()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 303, in begin
version, status, reason = self._read_status()
File "c:\users\a\appdata\local\programs\python\python38\lib\http\client.py", line 264, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "c:\users\a\appdata\local\programs\python\python38\lib\socket.py", line 669, in readinto
return self._sock.recv_into(b)
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))
希望大家给出出主意,该如何解决?
是否有完整代码
试试
也可以参考:https://stackoverflow.com/questions/526869...
不是你的标题太短, 是你有用的内容太少, 把问题复杂化了, 看懂都不容易, 还能回吗 ?
你的 demo 测试, 我跑起来结果是 OK !
网上有些说法, 不知道行不行....
按你的demo, 找一下问题
找到 webdriver 开的视窗标题为 WebDriver,
而且 window_handles = ['ab749431-887e-4257-a6dd-344715ccc47d']
注意该 handle 为 'ab749.....'
新开的视窗标题为 '百度一下,你就知道', 表示百度视窗已经打开了
注意该 handle 还是 'ab749.....', 表示是與 WebDriver 同一视窗
在通过 JS 脚本的方式打开新窗口
此时视窗标题还是 '百度一下,你就知道', 代表雖然打幵了新视窗 Google, 但 WebDriver 还是指向百度视窗
另外
新的 handle 加了进来, 是加在index为0, 不是index为1
所以如果要切换到 google 视窗, 要 driver.switch_to.window(driver.window_handles[
0
])而不是driver.window_handles[
1
]现在标题为 'Google' 了, 表示视窗已经切换过来了
视窗关闭, 所以 handles 中只剩百度, driver 所指向的视窗也不存在, 所以读取视窗标题会出错
既然, google 视窗已关闭, handles 就只剩百度, 当然得用 driver.window_handles[0]
百度视窗也关闭了, 所以handles, title都会出错
不用 driver 了, 最后再把 driver 也关闭 !
再加上我的运行环境
别用未完成版的Seleniium, 本来那就是可能还有问题的版本, 或者说是测试版, 出问题是很正常的.
一句一句执行, 看这两个错误是何时发生的 ?
第二个是在d.execute_script(newwindow)
那第一个呢 ?
d.execute_script (newwindow) 那表示还没 d.execute_script (newwindow), 就关闭连接了
问题不在 d.execute_script (newwindow)
这样问题不就缩小了, 目标就更明确 !
看了一下过程, 很可能是还没完全载入百度网页, 就作了下一步, 所以连接关闭了.
也许你要等网页完全加载完毕,才能进行下一步.
不过我的执行环境没有这个问题,可能还是版本问题, 比如你的Python內建的
http包
和socket.py
和我的就不一樣.当然啦,还可能有一个问题,是你的宽带不穩定....
打印了两个之后就出错了....
以下步骤中间必须停下来, 确认browser已经作完动作.
会出错吗?
会出错吗?
出错吗?
打印了两个之后就出错了....问题不在 d.execute_script (newwindow)
有了新的进展, 然后呢? nothing ??
你可以自分析一下情况, 行吗? 再提供更多的讯息...... 很显然这与你Python的工作环境有关, 如果你没有自己捞出一些讯息, 别人是帮不了你的.
最笨的方法
我又跑了一次demo, 发现 handles 内的顺序不是一定的, 所以切换视窗不能简单的以索引来调用
Just install Python 3.8.1, Selenium 3.141.0, urllib3 1.25.8
It still working for me…..
目前只能建议重新安装 Python, 这样可以去掉一些旧的安装
请问得到切确的解决方法了吗?救命!我也遇到了一样的问题。