Selenium自动化的使用

一、Selenium 是什么?
  • Selenium 是一个用于 Web 应用程序自动化测试的强大工具集。它支持多浏览器(如 Chrome、Firefox、Edge、Safari)、多语言(如 Java、Python、C#、JavaScript、Ruby)和多操作系统。
Selenium WebDriver
  • Selenium 项目由几个核心组件构成 Selenium IDE Selenium Grid Selenium WebDriver。 最常用的就是Selenium WebDriver
    • WebDriver 是 Selenium 的核心和灵魂
    • 它通过原生浏览器支持或浏览器扩展直接控制浏览器
二、核心使用流程(以 Python + Chrome 为例)

下面我们通过一个完整的例子,拆解使用 Selenium WebDriver 的典型流程。

步骤 1:环境搭建

1、安装 Python: 从官网下载并安装 Python。

2 、安装 Selenium 库: 使用 pip 命令安装。

pip3  install selenium

3、 下载浏览器驱动:

Chrome: ChromeDriver (与你的 Chrome 版本对应)

Firefox: GeckoDriver

Edge: Microsoft Edge Driver

将下载的驱动文件(如 chromedriver.exe)放在一个目录下,并将该目录添加到系统的 PATH 环境变量中,或者直接在代码中指定驱动路径。

driver = webdriver.Chrome(executable_path="C:\\01_webdriver\\chromedriver.exe")  # 指定chromedriver.ext的位置。

chromedriver下载地址

查看chorm浏览器的版本和缓存位置

URL位置输入chrome://version/ Google Chrom里能看到这个谷歌浏览器的版本。
个人资料路径就是缓存位置。
在这里插入图片描述

  • Selenium启动的浏览器默认是非登录状态的。计算机在通过浏览器来访问系统时,会默认加载部分可被缓存的数据到缓存文件之中的。
  • Selenium默认启动的浏览器是不会加载本地缓存文件的。所以可以理解为是一个全新的浏览器。干干净净的浏览器。
    • 1.第一次访问某个域名执行登录时,一定会要求有验证码。
    • 2.无法将需要读取的缓存数据及时加载,导致页面加载速度相对更慢一些。
      自动化测试不处理验证码。如果实际工作中有验证码的出现,记得联系开发取消验证码或者提供万能验证码。不要考虑识别验证码,因为 正确性太低了。
  • Selenium可以考虑通过加载本地缓存的方式,来解决验证码的问题。实现访问系统的时候就已经登录的效果。
    加载本地缓存的时候一定要关闭所有的浏览器,再执行脚本,否则会报错。
driver = webdriver.Chrome(executable_path="C:\\01_webdriver\\chromedriver.exe",
                          options=r'C:\Users\ZMX\AppData\Local\Google\Chrome\User Data')  # 添加options参数才能让设置生效

executable_path
保存的是chromedriver.exe的位置,然后options放的是谷歌浏览的缓存的位置。

步骤 2:编写第一个自动化脚本

假设我们要自动化完成以下操作:

  1. 打开百度首页。
  2. 在搜索框中输入 “Selenium”。
  3. 点击“百度一下”按钮。
  4. 等待结果加载,然后关闭浏览器。
# 导入 Selenium 的 WebDriver 模块
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 1. 创建一个 WebDriver 实例(启动浏览器)
# 如果驱动不在 PATH 中,需要指定路径:webdriver.Chrome(executable_path=r‘你的驱动路径’)
driver = webdriver.Chrome()

# 2. 打开目标网址
driver.get("https://www.baidu.com")

# 3. 定位元素并与之交互
# 通过 ID 定位搜索框
search_box = driver.find_element(By.ID, "kw")
# 在搜索框中输入文本
search_box.send_keys("Selenium")

# 通过 ID 定位“百度一下”按钮并点击
search_button = driver.find_element(By.ID, "su")
search_button.click()

# 4. 等待一段时间,观察结果(生产环境应使用显式等待)
time.sleep(5)

# 5. 关闭浏览器
driver.quit()

selinium常用步骤
1. 元素定位

你想操作一个元素,必须先获取这个元素,定位到这个元素才可以操作它,
这是 Selenium 自化中最关键的一步。WebDriver 提供了多种定位策略(通过 By 类):
看以看出这个方法返回的是一个webelement. 当你获取到了这个webelement后,就可以通过这个继续操作元素。
在这里插入图片描述by=By.ID通过下图看出, 这个By是一个类 ,所以By.ID 直接用id代替就行。同理By.XPATH 直接用xpath代替就行
在这里插入图片描述

from selenium.webdriver.common.by import By

# 通过 ID
element = driver.find_element(By.ID, "kw")#等价于element = driver.find_element("id", "kw")
# 通过 Name
element = driver.find_element(By.NAME, "wd")
# 通过 Class Name
element = driver.find_element(By.CLASS_NAME, "s_ipt")
# 通过 Tag Name
element = driver.find_element(By.TAG_NAME, "input")
# 通过链接文本(精确匹配)
element = driver.find_element(By.LINK_TEXT, "新闻")
# 通过部分链接文本(模糊匹配)
element = driver.find_element(By.PARTIAL_LINK_TEXT, "闻")
# 通过 CSS 选择器(功能强大,推荐)
element = driver.find_element(By.CSS_SELECTOR,#kw”)
element = driver.find_element(By.CSS_SELECTOR,input.s_ipt”)
# 通过 XPath(功能最强大,但可能较慢)
element = driver.find_element(By.XPATH,//input[@id=‘kw'])
element = driver.find_element(By.XPATH,//form[@id=‘form']/span/input)
当定位到这些元素的时候,
# 元素定位备份
# id:基于元素的id属性来定位元素。必须元素具备有id属性才可以。正常情况下ID值是唯一的。不同元素的ID不会重复。但不保证。
# print(driver.find_element('id', 'kw'))
# name:基于元素的name属性来定位元素。name值是可以允许重复的,所以使用name定位时要确认唯一性。
# print(driver.find_element('name', 'wd'))
# classname:基于元素的class属性来实现定位。个人不推荐使用
# print(driver.find_element('class name', 's_ipt'))
# tagname:基于元素的标签名来实现定位。自动化中不使用。爬虫领域下使用较多。
# for el in driver.find_elements('tag name', 'input'):
#     print(el)
# link text:通过元素的文本来实现元素定位。只能用于a标签。
# print(driver.find_element('link text', '新闻'))
# partial link text:通过元素的文本进行模糊查找定位。只限于a标签。类似于sql中的like %s%
# print(driver.find_element('partial link text', '京公网安备'))

# css selector:定位界的万金油。基于html中每一个元素的class值来实现元素的定位。具备有自己独有的语法结构。最快的定位方法。
# print(driver.find_element('css selector','#kw'))

# xpath:定位界万金油之二。html页面是基于树状结构来实现的。xpath本身就是基于树状结构的路径来获取元素。类似于文件系统
# xpath有自己的语法结构。因为遵循路径的方式获取元素,所有有相对路径和绝对路径两种xpath值。
# print(driver.find_element('xpath', '//*[@id="kw"]'))
# /html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[1]/input
'''
    xpath语法详解:

        绝对路径:从HTML跟路径下开始进行元素的位置查找,一层层往下找。
            /html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[1]/input 
            绝对路径的阅读性非常差,所以除非必要,一般不会使用绝对路径来实现元素定位。
        相对路径:就是所谓的查询/筛选功能。
            //*[@id="kw"] 
            // 从根路径下开始查找。也就是从html标签开始查找。
            *   表示任意元素。
            []  表示添加筛选条件
            @id @表示属性,id为属性名称
            ="kw"   对应的值
            text() 表示标签文本
        xpath定位元素时,可以使用任意属性作为定位的筛选条件。筛选条件可以用and进行多条件的关联。or这个也可以,但是定位元素,是要缩小范围,正常也不用。
    通过复制获取的xpath值,是存在有不稳定的可能性的。
    copy的值容易报错。例如遇到动态元素(属性值会在每一次加载页面时改变的元素)
    所以推荐使用手写xpath的方式来实现对元素的定位。准确度更高,稳定性更好。
    xpath的函数:

        contains: 
            表示模糊查找。基于指定的属性文本或者标签文本值进行模糊查找。
            //input[contains(@id,"k")]  基于模糊查找,将所有包含有id属性,且属性值包含有k的input标签返回
            //input[contains(text(),"k")]  基于模糊查找,将所有标签文本包含有k的元素返回

    元素获取的小技巧:
        1. 如果目标元素不好定位,可以通过定位子级或者父级,从而转向目标元素。
        2. xpath元素定位中,如果class属性值很多,则避免使用class来作为筛选条件。容易造成元素定位失败的问题。
        3. 元素定位前需要确保你需要定位的元素是这个。这个更多是在尝试和经验的积累。
        4. 元素定位方法没有固定的套路,适合的才是最好的。
'''
2. 浏览器操作
# 导航
driver.get("https://www.example.com") # 打开URL
driver.back()      # 后退
driver.forward()   # 前进
driver.refresh()   # 刷新

# 窗口管理
driver.maximize_window() # 最大化窗口
driver.set_window_size(1024, 768) # 设置窗口大小
driver.get_window_position() # 获取窗口位置

# 获取页面信息
title = driver.title
current_url = driver.current_url
page_source = driver.page_source
3. 元素交互

找到元素后,就可以进行元素的操作。

# 输入框
element.send_keys("要输入的文本") # 输入
element.clear()                # 清空
element.send_keys(Keys.RETURN) # 按回车键

# 点击
element.click()

# 下拉框 (Select)
from selenium.webdriver.support.ui import Select
select_element = Select(driver.find_element(By.ID, “select_id”))
select_element.select_by_visible_text(“选项文本”) # 根据文本选择
select_element.select_by_value(“option_value”)    # 根据 value 属性选择
select_element.select_by_index(1)                 # 根据索引选择

# 复选框/单选框
checkbox = driver.find_element(By.ID, “checkbox”)
if not checkbox.is_selected():
    checkbox.click()
4. 等待机制

定位元素的时候,有一个问题,就是元素可能没有加载出来。所以就有了等待机制。
这是避免脚本不稳定(元素未加载完就进行操作)的关键。

  • 强制等待: time.sleep(5),固定等待,效率低下。
  • 隐式等待: 设置一个全局超时时间,在查找元素时,如果元素没有立即找到,会轮询等待直到超时。
    driver.implicitly_wait(10) # 单位:秒
    
  • 显式等待(推荐): 针对某个特定条件进行等待,条件成立后再执行后续操作。更灵活、高效。
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 等待最多10秒,直到ID为‘kw’的元素出现
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, “kw”))
    )
    
    # 其他常用条件:
    # EC.element_to_be_clickable((By.ID, ‘su')) # 元素可点击
    # EC.visibility_of_element_located((By.ID, ‘kw')) # 元素可见
    # EC.title_contains(‘Selenium’) # 标题包含某文本
    

容易疑惑点:
既然说,隐式等待是一直轮询查找元素,一直等找到这个元素,那为什么还要有显示等待这种东西呢,因为隐式等待只是找到了元素。 一个元素出现 ≠ 元素可交互。隐式等待只确保元素在DOM中存在,但不关心元素是否:

  • 可见(可能被CSS隐藏)

  • 可点击(可能被禁用)

  • 可交互(可能被其他元素遮挡)

  • 而显式等待可以确保元素可以交互,从而减少后续操作失败的几率。

隐式等待的运行机制
driver.implicitly_wait(10)  # 设置10秒隐式等待

#隐式等待不是持续轮询,而是在调用find_element()时,如果元素立即找不到,才会开始轮询
#轮询间隔固定(通常是0.5秒),不是连续检查
#如果在第N次轮询时找到元素,总等待时间 = N × 0.5秒
显示等待的运行
# 显示等待可以自定义轮询频率
wait = WebDriverWait(driver, timeout=10, poll_frequency=0.1)  # 每0.1秒检查一次
element = wait.until(EC.element_to_be_clickable((By.ID, "button")))

# 或者更长的间隔节省资源
wait = WebDriverWait(driver, timeout=30, poll_frequency=2)  # 每2秒检查一次

# 隐式等待:只检查元素是否存在DOM中
element = driver.find_element(By.ID, "button")  # 元素可能存在但不可点击
element.click()  # 可能失败!

# 显示等待:等待元素真正可交互
button = wait.until(EC.element_to_be_clickable((By.ID, "button")))
button.click()  # 确保成功


五、高级技巧与最佳实践

  1. 使用 Page Object Model (POM):

    • 将页面封装成类,页面的元素定位和操作封装成类的方法。
    • 优点: 提高代码复用性、可维护性,当页面 UI 变动时,只需修改一个地方。
  2. 处理弹窗/Alert:

    alert = driver.switch_to.alert
    alert.accept()    # 点击“确定”
    alert.dismiss()   # 点击“取消”
    alert_text = alert.text # 获取弹窗文本
    
  3. 处理 Frame/Iframe:

    driver.switch_to.frame(“frame_name_or_id”) # 进入 frame
    # ... 在 frame 内进行操作 ...
    driver.switch_to.default_content() # 切回主文档
    
  4. 执行 JavaScript:

    driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);) # 滚动到页面底部
    driver.execute_script(“arguments[0].click();, element) # 用 JS 点击元素
    
  5. 截图:

    driver.save_screenshot(‘screenshot.png’)
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值