常用的Selenium基础使用模板和简单封装

前言

近来又用上了 Selneium ,因为反复用到,所以在这里将一些常用的方法封装起来,方便后续的使用。

在这篇文章中,我们将探讨 Selenium 的基础模板和基础封装,以便更好地理解 Selenium 的使用方法。

在Selenium的使用过程中,创建浏览器 和 定位节点等是最常见的操作,

这里将常用的方法记录下来,以其减少后续在使用过程中的烦恼。

实现

基础使用模板

Selenium4创建浏览器需要传入Service。

在使用 Selenium 时候,有时候需要隐藏一些Selenium的特征。

代码

代码释义

·使用了 ChromeDriverManager 来处理 chromedriver.exe 驱动的问题

· 考虑到驱动 和 js文件的问题,webdriver_path 和 js_file_path 都是可选参数,不传也不会报错

  1. # -*- coding: utf-8 -*-

  2.   # Name: model_main.py

  3.   # Author: 小菜

  4.   # Date: 2023/5/20 10:45

  5.   # Description:

  6.   from selenium import webdriver

  7.   from selenium.webdriver.support.ui import WebDriverWait

  8.   from selenium.webdriver.chrome.service import Service as ChromeService

  9.   from webdriver_manager.chrome import ChromeDriverManager

  10.   def init_driver(webdriver_path=None, js_file_path=None) -> webdriver.Chrome:

  11.    """

  12.    初始化浏览器驱动.

  13.    Args:

  14.    webdriver_path(str):浏览器驱动路径

  15.    js_file_path(str):js文件路径,用于隐藏Selenium的特征

  16.    Returns:

  17.    driver: 浏览器驱动对象

  18.    """

  19.    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(path=webdriver_path).install()))

  20.    if js_file_path:

  21.    js = open(file=js_file_path, encoding='utf-8')

  22.    driver.execute_cdp_cmd(

  23.    cmd_args={'source': js},

  24.    cmd="Page.addScriptToEvaluateOnNewDocument",

  25.    )

  26.    return driver

使用

然后再使用一个或多个显示等待,优雅极了!

  1. driver = init_driver()

  2.   wait_5 = WebDriverWait(driver, 5)

  3.   wait_10 = WebDriverWait(driver, 10)

简单封装

这份封装,称得上是优雅。使用了显示等待,兼容Selenium支持的各种定位方式!!!

可定位一个&多个节点、点击节点、文本输入、判断元素是否存在等~

代码

代码释义

·wait 和 value 为必选参数,其余的都是可选参数;

· by 默认的定位方式是 XPATH,可以传入其它定位方式,如 id, name 等;

· method 为 click 和 input,再加上默认的 定位,已经可以覆盖99%的节点操作;

· key 为 input 时候的文本内容,使用pyperclip 将 key复制到剪切板,然后执行键盘事件进行 Ctrl + V 黏贴,效率更高;

· 其余的看下面的 代码 和 使用 。

  1. import time

  2.   import pyperclip

  3.   from selenium.webdriver import Keys

  4.   from selenium.webdriver.support.ui import WebDriverWait

  5.   from selenium.webdriver.support import expected_conditions as ec

  6.   from selenium.common.exceptions import (

  7.    TimeoutException,

  8.    NoSuchElementException,

  9.    InvalidSelectorException,

  10.   )

  11.   def locate_and_operate_element(wait: WebDriverWait, by='xpath', value=None, method=None, key=None, is_more=False,

  12.    check_visibility=False):

  13.    """

  14.    定位元素并执行操作。

  15.    Args:

  16.    wait (WebDriverWait): WebDriverWait 对象,用于显示等待元素出现

  17.    by: 元素定位方式(例如 By.ID,By.XPATH)。

  18.    value: 元素定位值(例如元素的 ID,XPath 表达式)。

  19.    method (str): 操作方法(默认为 None)。

  20.    key: 输入文本的值(默认为 None)。

  21.    is_more (bool): 是否返回多个元素,默认为 False。

  22.    check_visibility (bool): 是否检查元素可见性(默认为 False)。

  23.    Returns:

  24.    WebElement: 元素对象(当 method 参数为 None 且 is_more 参数为 False 时);

  25.    None: 表示元素未在指定时间内出现或无法定位到指定的元素;

  26.    List[WebElement]: 多个元素对象列表(当 method 参数为 None 且 is_more 参数为 True 时)。

  27.    Raises:

  28.    TimeoutException: 超时异常,表示元素未在指定时间内出现。

  29.    NoSuchElementException: 未找到元素异常,表示无法定位到指定的元素。

  30.    InvalidSelectorException: 选择器无效异常,表示使用了无效的选择器。

  31.    """

  32.    assert isinstance(wait, WebDriverWait), "wait 参数必须是 WebDriverWait 类型。"

  33.    assert value, f"{value} 不能为空."

  34.    try:

  35.    element = wait.until(ec.presence_of_element_located((by, value)))

  36.    # 根据指定的操作方法执行相应操作

  37.    # 如果不指定方法, 默认为寻找对象是否存在

  38.    if not method:

  39.    if is_more:

  40.    return wait.until(ec.presence_of_all_elements_located((by, value)))

  41.    if check_visibility:

  42.    return wait.until(ec.visibility_of_element_located((by, value)))

  43.    return wait.until(ec.presence_of_element_located((by, value)))

  44.    if method == 'click':

  45.    wait.until(ec.element_to_be_clickable((by, value))).click()

  46.    time.sleep(2)

  47.    elif method == 'input':

  48.    assert key

  49.    wait.until(ec.visibility_of_element_located((by, value)))

  50.    pyperclip.copy(key)

  51.    time.sleep(0.2)

  52.    element.send_keys(Keys.CONTROL, 'A')

  53.    time.sleep(0.2)

  54.    element.send_keys(Keys.DELETE)

  55.    time.sleep(0.2)

  56.    element.send_keys(Keys.CONTROL, 'V')

  57.    time.sleep(0.2)

  58.    except TimeoutException:

  59.    print(f"超时:{by}={value}")

  60.    return None

  61.    except NoSuchElementException:

  62.    print(f"无法找到元素:{by}={value}")

  63.    return None

  64.    except InvalidSelectorException:

  65.    print(f"选择器无效:{by}={value}")

  66.    return None

使用

结合上面的 基础使用模板:

  1. driver = init_driver()

  2.   wait_5 = WebDriverWait(driver, 5)

  3.   """默认定位方式为xpath"""

  4.   # 定位某个节点

  5.   locate_and_operate_element(wait_5, value='specify_node')

  6.   # 定位多个节点

  7.   locate_and_operate_element(wait_5, value='specify_nodes', is_more=True)

  8.   # 判断某个节点是否可见

  9.   locate_and_operate_element(wait_5, value='specify_node', check_visibility=True)

  10.   # 点击指定节点

  11.   locate_and_operate_element(wait_5, value='specify_node', method='click')

  12.   # 输入内容

  13.   locate_and_operate_element(wait_5, value='specify_node', method='input')

总结

本文介绍了在 Selenium使用中的基础使用模板和简单封装。

·基础使用模板,针对隐藏chromedriver.exe驱动和隐藏Selenium特征做了通用适配,从此再也不用担心驱动出错和Selenium被网站发现的问题;

· 简单封装,针对定位节点、点击节点、输入文本等操作做了封装,并且针对代码给出了详细的注释。

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

封装 Selenium常用方法可以提高代码的可维护性和重用性。以下是一些常见的封装方法: 1. 初始化 WebDriver:封装一个初始化 WebDriver 的方法,可以根据需求选择不同的浏览器驱动,例如 Chrome、Firefox、Safari 等。 2. 打开网页:封装一个打开网页的方法,接受一个 URL 参数,可以通过 WebDriver 的 `get` 方法实现。 3. 定位元素:封装一个定位元素的方法,可以根据不同的定位方式(如 ID、class name、XPath 等)定位元素,并返回 WebElement 对象。 4. 输入文本:封装一个输入文本的方法,接受两个参数:要输入的文本和要输入的元素。可以使用 WebElement 的 `send_keys` 方法实现。 5. 点击元素:封装一个点击元素的方法,接受一个参数:要点击的元素。可以使用 WebElement 的 `click` 方法实现。 6. 获取元素文本:封装一个获取元素文本的方法,接受一个参数:要获取文本的元素。可以使用 WebElement 的 `text` 属性获取元素文本。 7. 获取元素属性:封装一个获取元素属性的方法,接受两个参数:要获取属性的元素和属性名称。可以使用 WebElement 的 `get_attribute` 方法获取元素属性。 8. 等待元素加载:封装一个等待元素加载的方法,接受两个参数:要等待的元素和最大等待时间。可以使用 WebDriverWait 类的 `until` 方法实现。 以上是一些常用封装方法,你可以根据需要进行扩展和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值