IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Selenium-使用教程

    vgbhfive发表于 2023-12-22 15:48:32
    love 0

    简介

    Selenium 最初是一个用于网站的自动化测试工具,支持各种 Chrome、Firefox、Safari 等主流浏览器,同时也支持 phantomJS 无界面浏览器。不过其更通常的使用在于爬虫中使用,其主要是用于解决 requests 无法直接执行 JavaScript 代码的问题,不过用于解析 Dom 元素更有其妙用之处。


    基础使用

    安装

    在 Python 中使用 Selenium 需要通过 pip 安装即可。

    1
    pip install selenium

    驱动程序

    Selenium 在安装之后还需要一个驱动程序来与浏览器交互,不同的浏览器都有自己的驱动程序。列表如下:

    浏览器下载链接
    Chromehttps://sites.google.com/chromium.org/driver/
    Edgehttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
    Firefoxhttps://github.com/mozilla/geckodriver/releases
    Safarihttps://webkit.org/blog/6900/webdriver-support-in-safari-10/

    不过在新版本 4.6.0 之后,发行包中包含一个 Selenium Manager 新工具,该工具帮助 Selenium 在发现驱动程序不可用时,会自动发现、下载并缓存驱动程序。

    基本使用

    模拟点击百度首页输出其标题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from selenium import webdriver
    from selenium.webdriver.common.by import By

    url = 'https://baidu.com'
    browser = webdriver.Chrome()
    browser.get(url)

    title = browser.find_element(By.TAG_NAME, 'title')

    print(title.text)

    常用操作

    元素定位

    通过方法查找元素的函数共有两个:

    • find_element(By.KEY, 'KEY_NAME')
    • find_elements(By.KEY, 'KEY_NAME')

    By.KEY 用于定位页面上的元素共有以下八种:

    • ID 通过元素的 ID 属性定位元素。
    • NAME 通过元素的名称属性定位元素。
    • XPATH 通过在 XML 文档中的 XPATH 节点定位元素。
    • LINK_TEXT 通过锚标记中使用的链接文本定位元素。
    • PARTIAL_LINK_TEXT 通过锚标记中使用的链接文本定位元素。
    • TAG_NAME 通过标签名称定位元素。
    • CLASS_NAME 通过类名定位元素。
    • CSS_SELECTOR 使用 CSS 选择器语法定位元素。

    WebElement 常用方法

    1. clear()
      如果元素是输入文本,则清除文本。
    2. click()
      单击该元素。
    3. get_attribute()
      获取元素的给定属性。
    4. get_dom_attribute()、
      获取元素在 HTML 标记中声明的元素。
    5. get_property()
      获取元素的给定属性。
    6. is_displayed()
      该元素是否对用户可见。
    7. is_enabled()
      该元素使用可用。
    8. is_selected()
      该元素是否被选中。
    9. send_keys()
      模拟在元素中输入内容。
    10. location
      获取元素的坐标。
    11. submit()
      提交表格。
    12. text
      元素的文本。
    13. tag_name
      元素的 tagName 属性。

    鼠标键盘事件

    1. click(on_element=None)
      单击左键。
    2. context_click(on_element=None)
      单击右键。
    3. double_click(on_element=None)
      双击左键。
    4. key_down(value, on_element=None)
      按下键盘上的某个键。
    5. key_up(value, on_element=None)
      松开键盘上的某个键。
    6. move_by_offset(xoffset, yoffset)
      鼠标从当前位置移动到某个坐标。
    7. move_to_element(to_element)
      鼠标移动到某个元素。
    8. move_to_element_with_offset(to_element, xoffset, yoffset)
      移动到距某个元素(左上角坐标)多少距离的位置。
    9. send_keys()
      发送某个键或者输入文本到当前元素。

    浏览器操作

    1. 获取页面的 URL

      1
      browser.current_url
    2. 获取页面日志

      1
      2
      3
      4
      5
      6
      7
      8
      browser.maximize_window() # 最大化
      browser.fullscreen_window() # 全屏
      browser.minimize_window() # 最小化
      browser.get_window_position() # 获取窗口的坐标
      browser.get_window_rect() # 获取窗口的大小和坐标
      browser.set_window_position(100, 200) # 设置窗口的坐标
      browser.set_window_rect(100, 200, 32, 50) # 设置窗口的大小和坐标
      browser.set_window_size(200, 300) # 设置窗口的大小
    3. 关闭页面

      1
      2
      browser.close() # 关闭当前标签页
      browser.quit() # 关闭浏览器并关闭驱动
    4. 屏幕操作

      1
      2
      3
      browser.save_screenshot('save.png') # 截图,只支持 PNG 格式
      browser.get_screenshot_as_png() # 获取当前窗口的截图作为二进制数据
      browser.get_screenshot_as_base64() # 获取当前窗口的截图作为 base64 编码的字符串
    5. 前进后退刷新

      1
      2
      3
      browser.forward() # 前进
      browser.back() # 后退
      browser.refresh() # 刷新

    cookie 操作

    1. get_cookie(NAME)
      获取指定键的 Cookies。
    2. get_cookies()
      获取所有的 Cookies。
    3. delete_cookie(NAME)
      删除指定键的 Cookies。
    4. delete_all_cookies()
      删除所有的 Cookies。

    JavaScript 操作

    Selenium 可以自定义执行 JavaScript。

    1
    browser.execute_script("alter('hello selenium!')")

    示例 Demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    import time

    # 获取居民消费价格指数 CPI 数据,数据来源于东方财富网。

    def to_next_page(browser):
    # 点击下一页,获取数据
    pagerbox = browser.find_elements(By.CLASS_NAME, 'pagerbox')[0]
    a = pagerbox.find_elements(By.TAG_NAME, 'a')
    for ai in a:
    if ai.text == '下一页':
    ai.send_keys(Keys.ENTER)
    print(ai.text)
    time.sleep(3)
    get_data()

    def get_data(browser):
    # 解析数据结构
    table = browser.find_element(By.CLASS_NAME, 'table-model')
    tbody = table.find_elements(By.TAG_NAME, 'tbody')[0]
    tr = tbody.find_elements(By.TAG_NAME, 'tr')
    print(len(tr))
    # 遍历数据结构并输出
    for tr_e in tr:
    td = tr_e.find_elements(By.TAG_NAME, 'td')
    print('-'*50)
    for td_e in td:
    print(td_e.text)
    # 下一页
    to_next_page(browser)

    def parse_url(url):
    browser = webdriver.Chrome()
    browser.get(url)
    # 获取 CPI 数据
    get_data(browser)
    browser.quit()

    if __name__ == '__main__':
    url = 'https://data.eastmoney.com/cjsj/cpi.html'
    # 解析 URL 并输出数据
    parse_url(url)

    异常信息

    NoSuchElementException

    在获取页面元素后,如果 Dom 发生变化就会出现该异常。

    stale element reference: stale element not found

    分析该问题是因为在 Dom 树中未找到该元素。因此其解决方案就是保证在操作前,该元素存在且是可操作的。


    引用

    官方文档


    个人备注

    此博客内容均为作者学习所做笔记,侵删!
    若转作其他用途,请注明来源!



沪ICP备19023445号-2号
友情链接