继上篇 2018 年 python3 与 selenium 教程第 2 节
切换 Frame
iframe
源码
- from selenium import webdriver
- import time
- from selenium.common.exceptions import NoSuchElementException
- browser = webdriver.Chrome() # 声明浏览器
- url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
- browser.get(url) # 访问网页
- browser.switch_to.frame('iframeResult') # 切换到 iframe
- try:
- logo = browser.find_element_by_class_name('logo')
- except NoSuchElementException:
- print('NO LOGO')
- browser.switch_to.parent_frame() # 回到主 html
- logo = browser.find_element_by_class_name('logo')
- time.sleep(2)
- print(logo)
- print(logo.text)
- browser.close() # 关闭浏览器
结果
- crawler python3 test_selenium.py
- NO LOGO
- <selenium.webdriver.remote.webelement.WebElement (session="8fb4596c155db901ddff0223f20889e3", element="0.9509151682616779-2")>
- RUNOOB.COM
延时等待
get() 方法会在网页框架加载完成后结束执行, 此时的网页源码可能并不完整, 如有些是 ajax 获取的数据, 需要延时等待才能获取到
等待的方式: 1. 隐式等待 2. 显式等待
隐式等待
若 selenium 没在 DOM 中找到节点, 将继续等待, 超出设定的时间后, 抛出找不到节点的异常
源码
- from selenium import webdriver
- import time
- browser = webdriver.Chrome() # 声明浏览器
- browser.implicitly_wait(3) # 隐式等待 3 秒
- url = 'https://www.zhihu.com/explore'
- browser.get(url)
- button = browser.find_element_by_class_name('zu-top-add-question')
- print(button)
- time.sleep(2)
- browser.close() # 关闭浏览器
结果
- crawler python3 test_selenium.py
- <selenium.webdriver.remote.webelement.WebElement (session="5a3262b7f812140d1b264511390bc519", element="0.95877441085998-1")>
显式等待
指定要查找的节点, 在指定的最长等待时间内, 如果加载出了节点, 就返回此节点; 否则抛出超时异常
源码
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- import time
- browser = webdriver.Chrome() # 声明浏览器
- url = 'https://www.zhihu.com/explore'
- browser.get(url)
- wait = WebDriverWait(browser, 3) # 显式等待
- button = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'zu-top-add-question')))
- print(button)
- time.sleep(2)
- browser.close() # 关闭浏览器
结果
- crawler python3 test_selenium.py
- <selenium.webdriver.remote.webelement.WebElement (session="299f7cc8d3e8713a7fbeff6bd90da8b0", element="0.45868114911518987-1")>
来源: http://www.jianshu.com/p/31201142a88f