2018年python3与selenium教程第3节

继上篇 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

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

显式等待

指定要查找的节点,在指定的最长等待时间内,如果加载出了节点,就返回此节点;否则抛出超时异常

源码

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

更多用法详见 官方文档

你可能感兴趣的:(2018年python3与selenium教程第3节)