selenium窗口切换(以爬取纵横小说网为例)
如果遇到二级窗口,就需要切换窗口,关闭新打开的标签页,并不能让代码自动进行窗口句柄的切换
1. 获取当前窗口的句柄
main_window = driver.current_window_handle
2. 点击链接,打开新的标签页
点击的时候,driver仍然控制着第一个窗口,由于a标签的target属性是_blank,所以出现了第二个窗口
tag_a = book.find_element_by_xpath('.//div/a') # 这是定位的链接
tag_a.click()
可以通过driver.window_handles查看当前标签页的个数
print('当前总共有{}个窗口'.format(len(driver.window_handles)))
3. 获得刚打开的标签页
book_detail_window = driver.window_handles[-1]
4. 切换为新标签页
driver.switch_to.window(book_detail_window)
操作结束后,新标签页没用了,所以使用close关闭,然后切换到原来的标签
driver.close() # 第二个窗口没用了,所以使用close关闭
driver.switch_to.window(main_window)
5. 最后附上完整的代码
from selenium import webdriver
driver = webdriver.Chrome() # 创建对象
driver.set_window_size(1920, 1080) # 设置固定大小
driver.implicitly_wait(5) # 等待元素出现
url = 'http://www.zongheng.com/rank/details.html?rt=6&d=1&p=1'
driver.get(url) # 发送请求
main_window = driver.current_window_handle # 获得当前窗口的句柄
# print(main_window)
book_list = driver.find_elements_by_xpath('//div[contains(@class,"rank_d_list")]')
# print(book_list)
for book in book_list:
# print('当前总共有{}个窗口'.format(len(driver.window_handles))) # 1个窗口
name = book.get_attribute('bookname')
tag_a = book.find_element_by_xpath('.//div/a')
tag_a.click() # 点击的时候,driver仍然控制着第一个窗口,由于a标签的target属性是_blank,所以出现了第二个窗口
# print('当前总共有{}个窗口'.format(len(driver.window_handles))) # 当前有2个窗口
book_detail_window = driver.window_handles[-1] # 最后那个窗口
driver.switch_to.window(book_detail_window) # 切换到第二个窗口才能操作第二个窗口
print(name, driver.find_element_by_xpath('//div[@class="nums"]').text) # 在第二个窗口
driver.close() # 第二个窗口没用了,所以使用close关闭
driver.switch_to.window(main_window) # 要操作第一个窗口,先切换到第一个窗口
# break
driver.quit()