Selenium用法全解析

简介🙂

本篇文章不介绍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. 常用方法

  1. driver.set_window_size():设置浏览器的大小
  2. driver.back():控制浏览器后退
  3. driver.forward():控制浏览器前进
  4. driver.refresh():刷新当前页面
  5. driver.close():关闭当前页面
  6. driver.quit():关闭所有页面
  7. driver.clear():清除文本
  8. driver.send_keys (value):模拟按键输入
  9. driver.click():单击元素
  10. driver.submit():用于提交表单
  11. driver.get_attribute(name):获取元素属性值
  12. driver.is_displayed():设置该元素是否用户可见
  13. driver.size:返回元素的尺寸
  14. driver.text:获取元素的文本

2. 元素定位

2.1 定位单个元素

  1. 通过元素id定位driver.find_element_by_id
  2. 通过元素name定位driver.find_element_by_name
  3. 通过xpath表达式定位driver.find_element_by_xpath
  4. 通过完整超链接定位driver.find_element_by_link_text
  5. 通过部分链接定位driver.find_element_by_partial_link_text
  6. 通过标签定位driver.find_element_by_tag_name
  7. 通过类名进行定位driver.find_element_by_class_name
  8. 通过css选择器进行定位driver.find_element_by_css_selector

2.2 定位多个元素

  1. 通过元素id定位driver.find_elements_by_id
  2. 通过元素name定位driver.find_elements_by_name
  3. 通过xpath表达式定位driver.find_elements_by_xpath
  4. 通过完整超链接定位driver.find_elements_by_link_tex
  5. 通过部分链接定位driver.find_elements_by_partial_link_text
  6. 通过标签定位driver.find_elements_by_tag_name
  7. 通过类名进行定位driver.find_elements_by_class_name
  8. 通过css选择器进行定位driver.find_elements_by_css_selector

2.3 通过等待条件定位(★★★)

from selenium.webdriver.support import expected_conditions as EC
  1. EC.title_is:标题是某内容
  2. EC.title_contains:标题包含某内容
  3. EC.presence_of_element_located:节点加载出来,传入定位元组,如(By.ID, ‘p’)
  4. EC.presence_of_all_elements_located:所有节点加载出来
  5. EC.visibility_of_element_located:节点可见,传入定位元组
  6. EC.visibility_of:可见,传入节点对象
  7. EC.text_to_be_present_in_element:某个节点文本包含某文字
  8. EC.text_to_be_present_in_element_value:某个节点值包含某文字
  9. EC.frame_to_be_available_and_switch_to_it:加载并切换
  10. EC.invisibility_of_element_located:节点不可见
  11. EC.alert_is_present:是否出现警告
  12. EC.element_to_be_clickable:节点可点击
  13. EC.element_to_be_selected:节点可选择,传入节点对象
  14. EC.element_located_to_be_selected:节点可选择,传入定位元组
  15. EC.element_selection_state_to_be:传入节点对象以及状态,相等返回True,否则返回False
  16. EC.element_located_selection_state_to_be:传入定位元组以及状态,相等返回True,否则返回False
  17. EC.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~在这里插入图片描述

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值