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
|
当前窗口网址后面 # 符号后面的一串可以忽略。