描述: 通常我们selenium元素的时间经常遇到只要跳转页面了,定位就总是找不到我要找的元素,这是因为的你定位指针driver没有指向第二个页面,所以无法定位。知道原因后哪怎么来切换定位窗口呢,很简历。
通过下面语句可获取当前指定的窗口handle name,但是这里很多学者会觉得他获取的就是第二个页面的handle name,从页面显示可得知,其实错了,我也犯过这些的错。我们需要获取driver会话中的所有窗口的handle name,然后在列表中通过遍历切换想要指定的窗口就行了
current_window = driver.current_window_handle # 获取当前窗口handle name
多页面产生后,通过遍历切换所要切换的窗口
all_window=driver.window_handles # 返回当前会话中所有窗口的句柄。
print("all_window:: ",all_window) # 打印当前所有窗口的句柄 name
for window in all_window: #通过遍历判断要切换的窗口
print("window:: ",window)
if window != current_window:
driver.switch_to.window(window) # 将定位焦点切换到指定的窗口,包含所有可切换焦点的选项
current_window = driver.current_window_handle # 获取当前窗口handle name
举例: 以百度为例,跳转第二个窗口后操作第二个
# coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('http://www.baidu.com') #填入URL
driver.find_element_by_id("kw").send_keys("selenium") #输入搜索内容
driver.find_element_by_id("su").click() # 点击搜索按钮
time.sleep(4) # 等待搜索后的内容
current_window = driver.current_window_handle # 获取当前窗口handle name
print("current_window:: ",current_window)
driver.find_element_by_xpath("//*[@id='2']/h3/a").click()
time.sleep(3) # 等待第二个页面
all_window=driver.window_handles # 返回当前会话中所有窗口的句柄。
print("all_window:: ",all_window) # 打印当前所有窗口的句柄 name
for window in all_window: #通过遍历判断要切换的窗口
print("window:: ",window)
if window != current_window:
driver.switch_to.window(window) # 将定位焦点切换到指定的窗口,包含所有可切换焦点的选项
current_window = driver.current_window_handle # 获取当前窗口handle name
print("current_window:: ",current_window) # 打印当前窗口的句柄 name
driver.find_element_by_xpath("/html/body/div[4]/div[2]/div/div[2]/dl[1]/dd/a[1]").click()
日志打印输出结果:
current_window:: CDwindow-B8D78AE0E2BE6E2DFC897241D4737563
all_window:: ['CDwindow-B8D78AE0E2BE6E2DFC897241D4737563', 'CDwindow-5E824943E381BDF6AE2B100CC60A0797']
window:: CDwindow-B8D78AE0E2BE6E2DFC897241D4737563
window:: CDwindow-5E824943E381BDF6AE2B100CC60A0797
current_window:: CDwindow-5E824943E381BDF6AE2B100CC60A0797
Process finished with exit code 0
通过日志输出是不是更加了解了窗口切换的元素定位了呢