简介🙂
本篇文章不介绍Selenium库的安装和原理,只归纳总结Selenium的所有用法
一、WebDriver配置
1. 配置选项(以Chrome为例)
1.1 实例化配置选项
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
1.2 不加载图片,加快访问速度
chrome_options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
1.3 设置为开发者模式,避免被识别
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
1.4 设置无界面模式
chrome_options.add_argument('--headless')
1.5 设置默认编码为utf-8
chrome_options.add_argument('lang=zh_CN.UTF-8')
1.6 通过设置user-agent,用来模拟移动设备
模拟 Android QQ浏览器
chrome_options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
模拟iPhone
chrome_options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')
1.7 阻止密码保存提示框的弹出
prefs = {}
prefs[“credentials_enable_service”] = False
prefs[“profile.password_manager_enabled”] = False
chrome_options.add_experimental_option(“prefs”, prefs)
1.8 添加应用扩展程序 (.crx文件)
extension_path = 'D:/extension/XPath-Helper_v2.0.2.crx'
chrome_options.add_extension(extension_path)
1.9 启动配置选项
from selenium import webdriver
driver = webdriver.Chrome(options=chrome_options)
2. 设置等待时间
2.1 显示等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome() # 加载浏览器驱动
waiting = WebDriverWait(driver, 30) # 设置显示等待30秒
node = waiting.until(EC.presence_of_element_located((By.XPATH, '//*[@id="kw"]'))) # 通过等待条件定位
2.2 隐示等待
from selenium import webdriver
driver = webdriver.Chrome() # 加载浏览器驱动
driver.implicitly_wait(30) # 设置隐示等待30秒
二、WebDriver操作
1. 常用方法
driver.set_window_size()
:设置浏览器的大小driver.back()
:控制浏览器后退driver.forward()
:控制浏览器前进driver.refresh()
:刷新当前页面driver.close()
:关闭当前页面driver.quit()
:关闭所有页面driver.clear()
:清除文本driver.send_keys (value)
:模拟按键输入driver.click()
:单击元素driver.submit()
:用于提交表单driver.get_attribute(name)
:获取元素属性值driver.is_displayed()
:设置该元素是否用户可见driver.size
:返回元素的尺寸driver.text
:获取元素的文本
2. 元素定位
2.1 定位单个元素
通过元素id定位
:driver.find_element_by_id通过元素name定位
:driver.find_element_by_name通过xpath表达式定位
:driver.find_element_by_xpath通过完整超链接定位
:driver.find_element_by_link_text通过部分链接定位
:driver.find_element_by_partial_link_text通过标签定位
:driver.find_element_by_tag_name通过类名进行定位
:driver.find_element_by_class_name通过css选择器进行定位
:driver.find_element_by_css_selector
2.2 定位多个元素
通过元素id定位
:driver.find_elements_by_id通过元素name定位
:driver.find_elements_by_name通过xpath表达式定位
:driver.find_elements_by_xpath通过完整超链接定位
:driver.find_elements_by_link_tex通过部分链接定位
:driver.find_elements_by_partial_link_text通过标签定位
:driver.find_elements_by_tag_name通过类名进行定位
:driver.find_elements_by_class_name通过css选择器进行定位
:driver.find_elements_by_css_selector
2.3 通过等待条件定位(★★★)
from selenium.webdriver.support import expected_conditions as EC
EC.title_is
:标题是某内容EC.title_contains
:标题包含某内容EC.presence_of_element_located
:节点加载出来,传入定位元组,如(By.ID, ‘p’)EC.presence_of_all_elements_located
:所有节点加载出来EC.visibility_of_element_located
:节点可见,传入定位元组EC.visibility_of
:可见,传入节点对象EC.text_to_be_present_in_element
:某个节点文本包含某文字EC.text_to_be_present_in_element_value
:某个节点值包含某文字EC.frame_to_be_available_and_switch_to_it
:加载并切换EC.invisibility_of_element_located
:节点不可见EC.alert_is_present
:是否出现警告EC.element_to_be_clickable
:节点可点击EC.element_to_be_selected
:节点可选择,传入节点对象EC.element_located_to_be_selected
:节点可选择,传入定位元组EC.element_selection_state_to_be
:传入节点对象以及状态,相等返回True,否则返回FalseEC.element_located_selection_state_to_be
:传入定位元组以及状态,相等返回True,否则返回FalseEC.staleness_of
:判断一个节点是否仍在DOM,可判断当前页面是否已经刷新
实例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome() # 加载浏览器驱动
waiting = WebDriverWait(driver, 30) # 设置显示等待30秒
driver.get('url') # 打开网址
element = waiting.until(EC.presence_of_element_located((By.XPATH, '//*[@id="kw"]'))) # 通过等待条件定位id
3. 获取节点信息
假设有如下网址url
,和id='kw'
的节点
driver.get('url')
node = driver.find_element_by_xpath('//*[@id="kw"]')
获取节点的所有信息
print(node.get_attribute('class')) # 获取节点的class属性值
print(node.id) # 获取节点的id值
print(node.text) # 获取节点的文本值
print(node.location) # 获取节点在页面中的相对位置
print(node.tag_name) # 获取节点的标签名称
print(node.size) # 获取节点的大小
4. 获取网页信息
print(driver.current_url) # 获取当前的URL
print(driver.page_source) # 获取网页源代码
print(driver.get_cookies()) # 获取当前页面所有cookie值
print(driver.get_cookie(name='key')) # 获取指定cookie值
5. 交互操作
5.1 Cookie交互(添加、删除)
driver.add_cookie({'domain': '.baidu.com', 'name': 'name'}) # 添加cookie
driver.delete_all_cookies() # 删除当前页面所有cookie值
5.2 节点交互
node.clear() # 清空文本
node.send_keys('python') # 输入文本
node.send_keys(Keys.ENTER) # 执行输入
5.3 网页交互
driver.back() # 网页后退
time.sleep(1)
driver.forward() # 网页前进
time.sleep(1)
driver.refresh() # 网页刷新
5.4 弹窗交互
driver.switch_to.alert.accept() # 点击确认
driver.switch_to.alert.dismiss() # 点击取消
driver.switch_to.alert.send_keys('123') # 在弹窗的文本框内输入信息
text = self.driver.switch_to.alert.text # 获取弹窗的文本信息
三、进阶用法
1. 切换到不同的windows窗口
def switch_to_windows(to_parent_windows=False):
"""
切换到不同的windows窗口
:param to_parent_windows: 默认为False,如果设置为True则回到主窗口
:return:
"""
total = driver.window_handles
if to_parent_windows:
self.driver.switch_to.window(total[0])
else:
current_windows = driver.current_window_handle
for window in total:
if window != current_windows:
driver.switch_to.window(window)
2. 切换到不同的frame框架
def switch_to_frame(index=0, to_parent_frame=False, to_default_frame=False):
"""
切换到不同的frame框架
:param index: expect by frame index value or id or name or element
:param to_parent_frame: 默认为False,如果设置为True则切换到上一个frame框架
:param to_default_frame: 默认为False,如果设置为True则切换到最上层的frame框架
:return:
"""
if to_parent_frame:
driver.switch_to.parent_frame()
elif to_default_frame:
driver.switch_to.default_content()
else:
driver.switch_to.frame(index)
3. 打开一个新的windows窗口
def open_new_windows(new_url=''):
"""
打开一个新的windows窗口
:param new_url: 新的URL
:return:
"""
js = "window.open({})".format(new_url)
driver.execute_script(js)
time.sleep(2)
4. 页面滚动
def page_scrolling(go_to_bottom=False, rolling_distance=(0, 1000)):
"""
页面滚动,如果没有滚动效果,添加延时(页面需要全部加载完毕才能滚动)
:param bool go_to_bottom: 默认为False,如果为True则滚动到当前页面的最底部
:param tuple rolling_distance: 滚动距离,默认是向下滚动1000像素
:return:
"""
time.sleep(5)
if go_to_bottom:
js = "window.scrollTo(0, document.body.scrollHeight)"
else:
js = "window.scrollBy({}, {})".format(rolling_distance[0], rolling_distance[1])
driver.execute_script(js)
5. 截取当前网页并保存为图片
def screenshot(picture_name='example.jpg'):
"""
截取当前网页并保存为图片
:param picture_name: 保存的图片名称
:return:
"""
driver.save_screenshot(picture_name)
6. 执行鼠标拖曳
actions = webdriver.ActionChains(self.driver) # 动作链初始化
def action_chain(self, source, target):
"""
执行鼠标拖曳
:param source: 拖曳前位置
:param target: 拖曳后位置
:return:
"""
actions.drag_and_drop(source, target)
actions.perform()
# 执行
source = self.driver.find_element_by_xpath('//*[@id="result_logo"]/img[1]')
target = self.driver.find_element_by_xpath('//*[@id="kw"]')
action_chain(source=source, target=target) # 鼠标拖曳
Over~