1、获取到所有的窗口,句柄handles
all_handles = driver.window_handles
print(all_handles)
2、获取当前的窗口
driver.current_window_handle
print(driver.current_window_handle)
3、利用切换的语句,切换到想要操作的窗口(HTML页面)
# 获取到的所有窗口为一个列表,用索引取
driver.switch_to.window(all_handles[-1])
举例说明
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
# 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com")
wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
time.sleep(2)
# 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1])
# 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2)
# 关闭浏览器
driver.quit()
上述的方法在新窗口出现之后,需要有一个强制的等待页面加载的时间time.sleep(2),这样是为了保证在页面未加载出来去点击,导致程序报错。我们采用的是强制等待的方式;那么在这里有一个小小的骚操作,在expected_conditions文件中,有一个new_window_is_opened类,等待新窗口的出现;该类调用时要传入一个current_handles的参数,功能为:所有的窗口句柄>current_handles,结果为True,条件成立。这个骚操作主要是为了替代强制等待这种方法,当然两种方法都可以用。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
# 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com")
wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
# 在新的窗口出现之前,获取窗口列表,这时窗口数为1
cur_handles = driver.window_handles
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
# 出现新的窗口之后,窗口数为2,2>1,条件为True
wait.until(EC.new_window_is_opened(cur_handles))
# 再次获取所有的窗口
# 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1])
# 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2)
# 关闭浏览器
driver.quit()