Python零基础之selenium进阶(多窗口和页面等待)

Python零基础之selenium进阶 - 多窗口和页面等待

  • 1. selenium中的页面等待
  • 2. selenium多窗口

1. selenium中的页面等待

  • 主要分为三种:固定等待,隐式等待,显式等待
    • 固定等待:通过time.sleep()实现,等待一段时间,这个时间可以是固定值也可以配合random模块调整为随机值
    • 隐式等待:通过.implicitly()实现,有等待条件,一般为有匹配对象就立刻结束等待时间,运行效率较高,但存在被反爬的风险
    • 显式等待:通过WebDriverWait()实现,与隐式等待类似,但增加了异常处理的条件,程序更为友好,但导入的模块较多,代码书写较为复杂,故使用较少

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

# 1. 定长等待
time.sleep(3)
driver.find_element_by_id('kw').send_keys('hello')
time.sleep(3)
print('sleep完啦')

# 2. 隐式等待
# 找到了就立刻返回,不是必须等完10秒
# 特点:运行效率高,节省时间
driver.implicitly_wait(10)
# 清楚数据
driver.find_element_by_id('kw').clear()
driver.implicitly_wait(10)
driver.find_element_by_id('kw').send_keys('你好')
print('implicitly完啦')

# 3. 显式等待
try:
    element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'su')))
    print('webDriverWait元素加载结束啦')
    element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.ID, 'su')))
    print('webDriverWait所有满足条件的元素加载结束啦')
    element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'su')))
    print('webDriverWait满足条件的元素可以点击啦')
finally:
    driver.quit()

2. selenium多窗口

  • 当需要打开多个窗口时:
    • .execute_script(‘window.open(“url”)’)
    • 新打开的窗口会被放到当前index值为[0]的窗口后边
  • 当需要对多个窗口进行操作时:
    • .switch_to.window(driver.window_handles[索引值])
  • 当需要关闭当前页面时:
    • .close()
  • 当需要关闭所有页面时:
    • .quit()
from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')
# 会覆盖百度的页面
# driver.get('https://www.douban.com')
time.sleep(2)

# 会打开新的标签页面,可以理解为另外开的
driver.execute_script('window.open("https://www.douban.com")')
time.sleep(2)

# 新打开的会被放在主页面[0]的后边,也就是百度关闭前始终是[0],搜狐是[1],豆瓣是[2]
driver.execute_script('window.open("https://www.sohu.com")')
time.sleep(2)

# 操作会对当前页面进行操作
driver.find_element_by_id('kw').send_keys('哈哈,我是当前页面')
time.sleep(2)
# 关闭了当前页面,也就是第一个get的页面,只有这个才是当前页面
# driver.close()
# target window already closed from unknown error: web view not found
# 第二次关闭会提示页面已关闭,找不到该页面

print('-'*50)

# 切换窗口 switch_to.windows切换
driver.switch_to.window(driver.window_handles[0])
print(driver.current_url)
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)
driver.switch_to.window(driver.window_handles[2])
print(driver.current_url)
print('-'*50)

# 在这个位置关闭了主页面以后,百度会变成[0],搜狐会变成[1]
# 因为当前切换到的主页面[2]豆瓣,已经被关闭
driver.close()

driver.switch_to.window(driver.window_handles[0])
print(driver.current_url)
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)

print('-'*50)

time.sleep(2)

# 关闭所有页面
driver.quit()

你可能感兴趣的:(Python零基础,PYTHON爬虫,selenium,python)