WebDriver API
一、定位元素
一共有八种定位元素的方法
- id定位 -》 find_element_by_id()
- name定位 -》 find_element_by_name()
- tag定位 -》 find_element_by_tag_name()
- class定位 -》 find_element_by_class_name()
- link_text定位 -》 find_element_by_link_text()
- partial link定位 -》 find_element_by_partial_link_text()
- XPath定位 -》 find_element_by_xpath()
- CSS_selector定位 -》 find_element_by_css_selector()
(一)、Xpath定位
1、绝对路径定位
find_element_by_xpath("/html/body/div/div[2]/from")
其中div[2]就是表示同一级的第二个div标签
2、利用元素属性定位
find_element_by_xpath("//input[@id='kw']")
其中//input表示当前页面的某个标签,[@id=‘kw’]表示这个元素的id是kw
find_element_by_xpath("//*[@id='kw']")
其中*表示任意标签
3、层级与属性结合
find_element_by_xpath("//span[@id='kw']/input")
4、使用逻辑运算符
find_element_by_xpath("//span[@id='kw']/input")
5、使用contains方法
contains方法用于匹配一个属性中包含的字符串
find_element_by_xpath("//span[contains(@class, 's-pu')]/input")
6、使用text()方法
find_element_by_xpath("//a[text(),'新闻']")
(二)、用By定位元素
使用By定位时,需要先进行导入
from selenium.webdriver.common.by import By
其效果与find_element_by_一样
方法如下
find_element(By.ID,''kw'')
find_element(By.NAME,'kw')
···
二、控制浏览器
主要包括控制浏览器窗口大小、控制浏览器前进后退和模拟浏览器刷新
from selenium import webdriver
from time import sleep
# 加载对应浏览器驱动,并打开浏览器
driver = webdriver.Chrome()
# 访问百度首页
URL1 = "http://baidu.com"
print("now access %s" % (URL1))
driver.get(URL1)
sleep(2)
# 参数数字为像素
print("设置浏览器宽400,高700")
driver.set_window_size(480, 700)
# 访问新网页
URL2 = "http://bnews.aidu.com"
print("now access %s" % (URL2))
driver.get(URL2)
sleep(2)
# 返回到百度首页
print("back to %s" % (URL1))
driver.back()
# 前进到新闻界面
sleep(1)
print("forward to %s " % (URL2))
driver.forward()
sleep(1)
# 刷新当前界面
driver.refresh()
driver.quit()
三、WebDriver中的常用方法
click()方法、clear()方法、send_keys()方法
from selenium import webdriver
from time import sleep
# 加载对应浏览器驱动,并打开浏览器
driver = webdriver.Chrome()
URL1 = "http://baidu.com"
driver.get(URL1)
# 清除文本
driver.find_element_by_id('kw').clear()
# 输入selenium
driver.find_element_by_id('kw').send_keys("sel")
# 点击搜索按钮
driver.find_element_by_id('su').click()
driver.quit()
submit()方法
其功能远远不及click()方法
from selenium import webdriver
from time import sleep
# 加载对应浏览器驱动,并打开浏览器
driver = webdriver.Chrome()
URL1 = "http://baidu.com"
driver.get(URL1)
# 输入selenium
driver.find_element_by_id('kw').send_keys("sel")
# 点击搜索按钮
driver.find_element_by_id('su').submit()
driver.quit()
size、text、get_attribute(name)、is_displayed()方法
from selenium import webdriver
from time import sleep
# 加载对应浏览器驱动,并打开浏览器
driver = webdriver.Chrome()
URL1 = "http://baidu.com"
driver.get(URL1)
# 获得输入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)
# 返回百度页面底部备案信息
text = driver.find_element_by_id('s-bottom-layer-right').text
print(text)
# 返回元素的属性值
att = driver.find_element_by_id('kw').get_attribute('type')
print(att)
# 返回元素结果是否可见,返回结果为True或False
result = driver.find_element_by_id('kw').is_displayed()
print(result)
driver.quit()
四、鼠标操作
在webdriver中,关于鼠标操作的方法都封装在ActionsChains类中
有以下常用的方法
perform() | 执行ActionsChains类中存储的所以行为 |
---|---|
context_click() | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element() | 鼠标悬停 |
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
# 定位到要悬浮的位置
above = driver.find_element_by_id("s-usersetting-top")
# 对定位到的元素执行鼠标操作
ActionChains(driver).move_to_element(above).perform()
driver.quit()
五、键盘操作
使用send_keys()方法时,需要先进行以下的导入
from selenium.webdriver.common.keys import Keys
采用方法如下表
方法 | 对应键盘操作 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 指标键 |
send_keys(Keys.ESCAPE) | 回退键()Esc |
send_keys(Keys.ENTER) | 回车键 |
send_keys(Keys.CONTROL,‘a’) | 全选(ctrl +a) |
send_keys(Keys.CONTROL,‘c’) | 复制 |
send_keys(Keys.CONTROL,‘x’) | 剪切 |
send_keys(Keys.CONTROL,‘v’) | 粘贴 |
send_keys(Keys.F1) | 键盘F1 |
···· | ···· |
六、获取验证信息
这边主要介绍title、current_url和text
title 获取当前标题
current_url 获取当前页面的URL
text 用于获取当前界面的文本信息
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 打印当前title/URL
print(driver.title)
print(driver.current_url)
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
# 再次打印title/url
print(driver.title)
print(driver.current_url)
# 获取搜索结果条数
num = driver.find_element_by_class_name('nums').text
print(num)
driver.quit()
七、设置元素等待
显式等待
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
其中
driver :浏览器驱动
timeout :最长超时时间,默认以秒为单位
poll_frequency : 检测的间隔时间,默认为0.5s
ignored_exceptions : 超时后的异常信息,默认情况下抛出NoSuchElementException和Exception异常
通常情况下,WebDriverWait方法与until方法或者until_not()方法配合使用
until(method,message='')
调用该方法提供的驱动程序作为参数,知道返回值为True,until_not()方法类似
隐式等待
implicitly_wait()方法
如implicitly_wait(10)方法,表示等待时间为10s,但是不是固定时间(最长等待时间10S),不会影响脚本的运行速度
八、定位一组元素
该方法与定位单个元素非常类似,不同的是当初element多了个s
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)
# 定位一组元素
texts = driver.find_elements_by_xpath("//div[@tpl='se_com_default']/h3/a")
# 计算匹配结果个数
print(len(texts))
# 循环遍历出每一条搜索结果的标题
for t in texts:
print(t.text)
driver.quit()
九、多窗口切换
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 获得百度搜索窗口的句柄
search_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text('立即注册').click()
# 获得当前所有打开的窗口句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
if handle != search_windows:
driver.switch_to_window(handle)
print(driver.title)
driver.find_element_by_id("userName").send_keys('username')
driver.find_element_by_id("phone").send_keys('14502658796')
sleep(2)
# 回到搜索窗口
driver.switch_to_window(search_windows)
print(driver.title)
driver.quit()
十、警告框与下拉框处理及窗口截图
警告框处理
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 打开搜索设置
link = driver.find_element_by_link_text('设置').click()
driver.find_element_by_link_text('搜索设置').click()
sleep(2)
# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
# 获取警告框
alter = driver.switch_to_alert
# 获取警告框的提示信息
alter_text = alter.text
print(alter_text)
# 截取警告窗
alter.accept()
driver.quit()
下拉框处理
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 打开搜索设置
link = driver.find_element_by_link_text('设置').click()
driver.find_element_by_link_text('搜索设置').click()
sleep(2)
# 搜索结果显示条数
sel = driver.find_element_by_xpath("//selector[@id=nr]")
Select(sel).select_by_value('20')
sleep(2)
Select(sel).select_by_visible_text("每页显示50条")
sleep(2)
# 通过下拉框的索引进行选择
Select(sel).select_by_index(0)
sleep(2)
driver.quit()
窗口截图
# 截取当前窗口,指定截图图片的保存位置
driver.save_screenshot("./1.png")
十一、滑动解锁
首页要导入ActionChains类
from selenium.webdriver import ActionChains
水平滑动
# 定位滑块
slider = driver.find_elements_by_class_name("******")
# 加载驱动
action = ActionChains(driver)
# 单击并按下左键
action.click_and_hold(slider).perform()
# 移动滑块
action.move_by_offset(横坐标,纵坐标).perform()
时间上下滑动
# 定位要滑动的年
sl = driver.find_elements_by_class_name("******")
year = sl[0]
action = webdriver.TouchActions(driver)
action.scroll_from_element(year, x, y).perform()
十二、JS调用与HTML视频播放处理
js调用
# 通过js设置浏览器窗口的滚动条
js = 'window.scrollTo(100, 450);'
driver.execute_script(js)
HTML视频播放处理
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
video = driver.find_element_by_id("preview-player_html5_api")
# 返回播放文件的地址
url = driver.execute_script("return argument[0].currentSrc;", video)
print(url)
# 播放视频
print("start")
driver.execute_script("argument[0].play()", video)
# 播放15s
sleep(15)
# 暂停视频
driver.execute_script("argument[0].pause()",video)
driver.quit()
十二、Cookie的操作方法
WebDriver操作Cookie的方法主要有如下几种
方法 | 功能 |
---|---|
get_cookies() | 获得所有Cookie |
get_cookies() | 返回字典中的Key为‘name’的Cookie |
add_cookie(cookie_dict) | 添加Cookie |
delete_cookie(name,optionsString) | 删除名为OpenString的Cookie |
deldete_all_cookies() | 删除所有Cookie |
# 获得所有cookie
cookie = driver.get_cookies()
# 添加cookie信息
driver.add_cookie({'name':'aaa','value':'bbb'})
# 遍历指定的cookie
for cookie in driver.get_cookies():
print("%s->%s" % (cookie['name'], cookie['value']))