Python selenium 切换到新的窗口方法
HDUZN

Python 用selenium(文章代码中使用selenium3版本) 在网页上操作的时候,我们经常遇到,点击一个链接 或者 按钮,就会打开一个新窗口 。

然后会出现一个问题,新的窗口虽然打开了,但是 WebDriver对象对应的还是老窗口,自动化操作也还是在老窗口进行。那就无法在新窗口上进行自动化操作了。

重现问题

举个例子,比如我要打开下面代码中的 site的网址,然后点击最上面一排的【基金净值】,会打开一个新的网页。但我们通过打印 webdriver的标题(title),就知道还是在原来的老窗口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from selenium import webdriver

driver_path = r'F:\python\chromedriver.exe'
option = webdriver.ChromeOptions()
option.add_argument("headless")
wd = webdriver.Chrome(driver_path, options=option)
wd.implicitly_wait(10)

site = 'https://fund.eastmoney.com/'
wd.get(site)

fund_element = wd.find_element_by_css_selector('.wrapper_min .jz a')
element_name = fund_element.text
element_site = fund_element.get_attribute('href')
print('当前窗口标题:', wd.title)
print('当前窗口网址:', wd.current_url)
print('点击的链接为:', element_site)

fund_element.click()

print('当前窗口标题:', wd.title)
print('当前窗口网址:', wd.current_url) #网址后面 # 后面的一串忽略

运行后的结果是:

1
2
3
4
5
前窗口标题: 天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台!
当前窗口网址: https://fund.eastmoney.com/
点击的链接为: http://fund.eastmoney.com/fund.html
当前窗口标题: 天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台!
当前窗口网址: https://fund.eastmoney.com/

解决方法

可以使用Webdriver对象的switch_to属性的 window方法:

1
driver.switch_to.window(handle)

其中,参数handle就是句柄,可以想象成对应网页窗口的一个ID。
WebDriver对象有window_handles 属性,这是一个列表对象, 里面包括了当前浏览器里面所有的窗口句柄。

解决思路

  • 我们可以通过循环这个handles列表,一个个handle对应的窗口找过去;
  • 当找到handle对应的窗口的current_url属性 和我们点击的链接url相同的时候,就找到了我们需要的窗口的handle,然后就跳出循环。

下面这段代码就放在 fund_element.click() 之后:

1
2
3
4
5
# 切换到新链接的窗口
for handle in wd.window_handles:
wd.switch_to.window(handle) # 先切换到新的窗口
if(wd.current_url == element_site):
break

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from selenium import webdriver

driver_path = r'F:\python\chromedriver.exe'
option = webdriver.ChromeOptions()
option.add_argument("headless")
wd = webdriver.Chrome(driver_path, options=option)
wd.implicitly_wait(10)

site = 'https://fund.eastmoney.com/'
wd.get(site)

fund_element = wd.find_element_by_css_selector('.wrapper_min .jz a')
element_name = fund_element.text
element_site = fund_element.get_attribute('href')
print('当前窗口标题:', wd.title)
print('当前窗口网址:', wd.current_url)
print('点击的链接为:', element_site)

fund_element.click()

# 切换到新链接的窗口
for handle in wd.window_handles:
wd.switch_to.window(handle)
if(wd.current_url == element_site):
break

print('当前窗口标题:', wd.title)
print('当前窗口网址:', wd.current_url)

运行结果如下:

1
2
3
4
5
当前窗口标题: 天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台!
当前窗口网址: https://fund.eastmoney.com/
点击的链接为: http://fund.eastmoney.com/fund.html
当前窗口标题: 每日开放式基金净值表 _ 天天基金网
当前窗口网址: http://fund.eastmoney.com/fund.html#os_0;isall_0;ft_;pt_1

当前窗口网址后面 # 符号后面的一串可以忽略。

  • 本文标题:Python selenium 切换到新的窗口方法
  • 本文作者:HDUZN
  • 创建时间:2021-02-19 14:20:00
  • 本文链接:http://hduzn.cn/2021/02/19/Python-selenium3-切换到新的窗口方法/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论