Selenium 个人学习笔记
准备工作
一: 安装Chrome浏览器
二: 根据你浏览器的版本号下载 ChromeDriver (笔者的版本号是 76.0.3809.100
)
三:环境变量配置
(windows下)直接将ChromDriver可执行文件复制到python的Script目录下
四:验证安装
在cmd中直接执行 chromedriver
命令
如图
1.selenium基本使用
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input_ = browser.find_element_by_id('kw')
input_.send_keys('Python')
browser.close()
2.声名浏览器对象
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
3.访问页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()
4.查找节点
- 单个节点
from selenium import webdriver
# 查找节点
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')
# input_first_1 = browser.find_element(By.ID, 'q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first, input_second, input_third, sep='
')
browser.close()
- 获取单个节点的方法
find_element_by_id()
find_element_by_name()
find_element_by_xpath()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_tag_name()
find_element_by_class_name()
find_element_by_css_selector()
find_element() #通用方法
需要传入两个参数
如:
find_element_by_id == find_element(By.ID, id)
- 多个节点
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()
#在单节点的基础上,element 加一个 s
5节点交互
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_ = browser.find_element_by_id('q')
input_.send_keys('跳蛛') #输入文字
time.sleep(1)
input_.clear() # 清空文字
input_.send_keys('蜥蜴')
button = browser.find_element_by_class_name('btn-search')
button.click()
6动作链
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
7.执行JavaScript
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
*8.获取节点信息
from selenium import webdriver
#获取属性
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
logo = browser.find_element_by_id('su')
print(logo)
print(logo.get_attribute('class'))
# 获取文本值
browser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)
input_ = browser.find_element_by_class_name('mnav')
print(input_.text)
# 获取id、位置、标签名和大小
from selenium import webdriver
browser = webdriver.Chrome()
url= 'https://www.zhihu.com/explore'
browser.get(url)
input_ = browser.find_element_by_xpath('//*[@id="Popover1-toggle"]')
print(input_.tag_name)
print(input_.location)
print(input_.size)
print(input_.id)
print(input_.__class__)
9.切换Frame
Selenium打开页面后,默认是在父级Frame里面操作的,而此时如果页面中还有子Frame,是不能够获取到子Frame里面的节点的。这时需要使用Switch_to_frame()
方法
ex:
from selenium import webdriver
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') # 切换到子Frame
try:
logo = browser.find_element_by_class_name('logo') # 尝试获取Frame里的logo节点
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
10.延时等待
get()方法会在网页框架加载结束后结束执行,此时获取 page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源码中也不一定能成功获取到,所以,这里需要延时等待一定时间,确保节点已经加载出来。
- 隐式等待
当查找节点而节点并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间是0
ex:
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10) # 隐式等待
url = 'https://pixabay.com/zh/images/search/%E8%B7%B3%E8%9B%9B/'
browser.get(url)
browser.close()
- 显示等待
指定要查找的节点,然后指定一个最长等待时间。如果规定时间内加载出来了该节点,返回查找的节点;反之,抛出超时异常。
ex:
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
browser = webdriver.Chrome()
url = 'https://www.taobao.com'
browser.get(url)
wait = WebDriverWait(browser, 10) # 显式等待
input_ = wait.until(EC.presence_of_element_located((By.ID, 'q'))) # 等待条件
botton_ = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input_, botton_, sep='
')
- 等待条件极其含义
等待条件 | 含义 |
---|---|
title_is | 标题是某内容 |
title_contains | 标题包含某内容 |
presence_of_element_located | 节点加载出来,传入定位元组, 如(By.ID, 'p') |
visibility_of_element_located | 节点可见,传入定位元组 |
visibility_of | 可见,传入节点对象 |
presence_of_all_elements_located | 所有节点加载出来 |
text_to_be_present_in_element | 某个节点文本包含某文字 |
text_to_be_present_in_element_value | 某个节点值包含某文字 |
frame_to_be_available_and_switch_to_it | 加载并切换 |
invisibility_of_element_located | 节点不可见 |
element_to_be_clickable | 节点可点击 |
staleness_of | 判断一个节点是否仍在DOM,可判断网页是否已经刷新 |
element_to_be_selected | 节点可选择,传节点对象 |
element_located_to_be_selected | 节点可选择,传入定位元组 |
element_selection_state_to_be | 传入节点对象及状态,相等返回True,否则返回False |
element_located_selection_state_to_be | 传入定位元组及状态,相等返回True,否则返回False |
alert_is_present | 是否出现警告 |
11.前进和后退
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.python.org')
browser.back() # 后退
time.sleep(1)
browser.forward() # 前进
browser.close()
12.Cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'duoban', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
13.选项卡管理
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles) # 获取当前开启的所有选项卡
browser.switch_to.window(browser.window_handles[1]) # 参数为 选项卡代号
browser.get('https://mail.qq.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://translate.google.cn/')
14异常处理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('Time out')
try:
browser.find_element_by_id('help')
except NoSuchElementException:
print('No Element')
finally:
browser.close()