智能体测开Day29
2026/7/21 16:57:44 网站建设 项目流程

浏览器的操作

''' 回退 前进 浏览器窗口的最大化 浏览器窗口的最小化 浏览器窗口的关闭 退出 ''' import time from selenium import webdriver from selenium.webdriver.common.by import By #获取驱动 driver = webdriver.Edge() driver.get("http://www.baidu.com") time.sleep(1) # 使用驱动打开一个网页 driver.get("http://www.sogou.com") time.sleep(1) driver.get("http://www.zhihu.com") time.sleep(1) # 回退 driver.back() time.sleep(2) # 前进 driver.forward() time.sleep(2) # 窗口最大化 driver.maximize_window() time.sleep(2) # 窗口最小化 driver.minimize_window() time.sleep(2) # 设置窗口大小 driver.set_window_size(500,400) time.sleep(2) # 关闭窗口 driver.close() # driver.quit() 退出

iframe

''' 从原网页到iframe网页之间进行操作,需要进行iframe的切换 driver.switch_to.frame(定位到的iframe) 切入到iframe中 切出操作 切换到默认层(最外层):driver.switch_to.default_content() 切换到上一层:driver.switch_to.parent_frame() ''' import time from selenium import webdriver from selenium.webdriver.common.by import By #获取驱动 driver = webdriver.Edge() # 使用驱动打开一个网页 driver.get("http://127.0.0.1/ranzhi/www") time.sleep(1) # 登录 driver.find_element("id",'account').send_keys("admin") driver.find_element("id",'password').send_keys("123456") driver.find_element("id",'submit').click() time.sleep(1) # 点击后台管理 driver.find_element('id',"s-menu-superadmin").click() time.sleep(1) # 定位iframe i = driver.find_element("id","iframe-superadmin") # 切换到iframe中 driver.switch_to.frame(i) # 点击添加成员 driver.find_element("link text","添加成员").click() time.sleep(2) # 切换到最外层 # driver.switch_to.default_content() # 上一层 driver.switch_to.parent_frame() # 签退 driver.find_element("link text",'签退').click() time.sleep(10)

下拉框

''' select option 1)获取所有的文本 获取select实例化对象 Select() select对象.options 可以获取下拉框的所有选项对象 遍历options,每个变量为单个option对象,通过option对象的.text获取单个option的文本 2)下拉框的选中操作 获取select实例化对象 Select() (1)根据文本选中 (2)根据下标选中 (3)根据value属性选中 ''' import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select #获取驱动 driver = webdriver.Edge() # 使用驱动打开一个网页 driver.get("http://127.0.0.1/ranzhi/www") time.sleep(1) # 登录 driver.find_element("id",'account').send_keys("admin") driver.find_element("id",'password').send_keys("123456") driver.find_element("id",'submit').click() time.sleep(1) # 点击后台管理 driver.find_element('id',"s-menu-superadmin").click() time.sleep(1) # 定位iframe i = driver.find_element("id","iframe-superadmin") # 切换到iframe中 driver.switch_to.frame(i) # 点击添加成员 driver.find_element("link text","添加成员").click() time.sleep(2) # 下拉框:创建select对象 a = driver.find_element("id","dept") select = Select(a) # 获取所有options os = select.options list = [] # 遍历 for o in os: print(o.text) list.append(o.text) # 根据文本选中 # select.select_by_visible_text("/市场部") # select.select_by_visible_text(list[1]) # 根据下标选中 # select.select_by_index(0) # 根据value选中 select.select_by_value("10") time.sleep(10) # 切换到最外层 # driver.switch_to.default_content() # 上一层 driver.switch_to.parent_frame() # 签退 driver.find_element("link text",'签退').click() time.sleep(10)

弹出框

''' 弹出框: 1)警告框:提示信息+确认按钮 eg:警告密码的长度为10-18位 2)确认框:提示信息+确认按钮+取消按钮 eg:是否删除 3)提示框: 输入信息+确认按钮+取消按钮 切换:switch_to.alert 提示信息:text 确认:accept 取消:dismiss 输入信息:send_keys() ''' import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select #获取驱动 driver = webdriver.Edge() # 使用驱动打开一个网页 driver.get("http://127.0.0.1/ranzhi/www") time.sleep(1) # 登录 driver.find_element("id",'account').send_keys("admin") driver.find_element("id",'password').send_keys("123456") driver.find_element("id",'submit').click() time.sleep(1) # 点击文档 driver.find_element("id",'s-menu-4').click() # 切换iframe driver.switch_to.frame(driver.find_element("id",'iframe-4')) # 点击其中一个文档库 driver.find_element('class name','libs-group-heading.libs-custom-heading').click() # 点击创建文档 driver.find_element("link text","创建文档").click() time.sleep(1) # 选择文件 f = driver.find_element("name","files[]") f.send_keys("D:\\Tools\\jdk-8u371-linux-x64.tar.gz")# 对选择文件进行操作 time.sleep(1) # 切换到弹出框,并且获取弹出框对象 a = driver.switch_to.alert print(a.text) # 提示信息 # 点击确认按钮 a.accept() # 切换到最外层 # driver.switch_to.default_content() # 上一层 driver.switch_to.parent_frame() # 签退 driver.find_element("link text",'签退').click() time.sleep(10)

三种等待

''' 网页如果加载过慢,定位的元素可能出错,所以需要等待,等待元素的加载 1)强制等待 time.sleep() 2)隐式等待:也叫全局等待。针对所有标签都有效的等待 当元素定位不到时,会等待查找,如果在等待时间范围内查找到,停止等待,继续运行。如果超出等待时间,还没有查找到,会报异常 一般隐式等待定义在代码的上面 这种等待不够灵活(只要元素定位不到,就会等待),精度不够,可能造成等待时间过长,还没有定位到 driver.implicitly_wait(等待的秒数) 3)显式等待:针对单个元素的等待,可以设置等待条件 WebDriverWait(驱动,等待时长,查找间隔时间).until(条件) WebDriverWait(driver,3,0.5).until(条件) 条件封装在expected_conditions模块中 面试考点 1)三种等待式什么?他们的使用场景分别是什么 2)显式等待和隐式等待的区别: https://cp.baidu.com/landing/tscp_doc/4fa68cc3ca54ffc1726dead7a288fd15 ''' import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait #获取驱动 driver = webdriver.Edge() # 使用驱动打开一个网页 driver.get("http://www.sogou.com") # 隐式等待 driver.implicitly_wait(3) # 定位元素,使用显式等待 locator=("id","query") a = WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)) a.send_keys("显式等待") # 强制等待 time.sleep(10)

截屏

import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait #获取驱动 driver = webdriver.Edge() # 使用驱动打开一个网页 driver.get("http://www.sogou.com") # 隐式等待 driver.implicitly_wait(3) # 截图 # 文件名:时间戳 当前时间 UUID filename = time.strftime("%Y%m%d%H%M%S",time.localtime()) driver.save_screenshot(f'xinqidian_sogou_index_{filename}.png') # 二次定位: # 先定位父元素,再定位子元素 fu = driver.find_element("class name","top-nav") es = fu.find_elements("tag name",'a') for e in es: print(e.text)

背诵内容

定位方法有哪些?

  • id:find_element (By.ID, "id 值")
  • name:find_element (By.NAME, "name 值")
  • class_name:单一 class,不能多类名
  • tag_name:标签名如 div、input
  • link_text:完整匹配超链接文字
  • partial_link_text:模糊匹配链接文字
  • xpath:路径定位,最灵活通用
  • css_selector:css 选择器,性能优于 xpath

如何选择页面组件的定位?

  • 优先 ID:唯一、稳定、速度最快,开发规范页面必加 id
  • 其次 Name:表单 input 常用,唯一则优先使用
  • CSS 选择器:无 id/name 时首选,性能好,语法简洁
  • XPath:复杂场景(文本匹配、多条件、无唯一属性)使用
  • link_text/partial_link_text:仅 a 标签超链接专用
  • class_name/tag_name:极少单独用,大多配合 css/xpath 组合

元素定位不到可能是什么原因?

  • 页面未加载完成:网络慢、异步渲染,未加等待直接查找
  • iframe 嵌套:目标元素在 iframe 内,未切换 switch_to.frame ()
  • 窗口切换:点击打开新标签页,未切换窗口句柄
  • 定位表达式错误
    • xpath 绝对路径层级变动失效;
    • class_name 传入多个 class;
    • 空格、大小写、文本前后换行空格未处理;
    • 动态 id/class(每次刷新值变化)
  • 元素不可见:display:none、visibility:hidden、透明度 0、被遮罩覆盖
  • 元素不在可视区域:滚动条未下拉,元素被遮挡
  • 动态延迟渲染:下拉框、弹窗 hover 后才生成 DOM
  • 多同名元素:find_element 取第一个,目标是第二个需索引 / 过滤
  • 页面刷新 / 跳转:旧 dom 元素过期,报 StaleElementReferenceException
  • 弹窗 / 遮罩层遮挡,元素无法交互

下拉框怎么选中一个选项?

原生<select>下拉(Select 类专用)

from selenium.webdriver.support.select import Select sel = Select(driver.find_element(By.ID, "selectId")) # 三种选中方式 sel.select_by_index(0) # 下标从0开始 sel.select_by_value("1") # option的value属性 sel.select_by_visible_text("选项文字") # 显示文本

有哪些等待方式?

1. 强制等待(time.sleep ())
固定休眠,不管页面是否加载完成,不推荐项目使用

import time time.sleep(3)

2. 隐式等待 implicitly_wait
全局设置,查找元素时最长等待时长,作用整个 driver 生命周期

driver.implicitly_wait(10)

3. 显式等待 WebDriverWait + 预期条件 EC
针对性等待单个元素 / 状态,精准、性能最好,项目标准用法

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10, 0.5) ele = wait.until(EC.presence_of_element_located((By.ID,"btn")))

显式等待和隐式等待的区别?

对比隐式等待 implicitly_wait显式等待 WebDriverWait
作用范围全局,所有 find_element 生效仅针对当前写的单个元素
等待规则查找元素找不到就循环等待,超时抛错自定义等待条件(可见、可点击、文本、弹窗等)
灵活性差,只能等元素存在,无法判断可点击 / 可见丰富,支持几十种页面状态判断
性能较差,全局统一等待时长精准,加载完成立刻执行,不浪费时间
混用风险同时设置时,等待时间取两者最大值,容易超时无全局副作用,推荐优先使用
使用场景简单小脚本临时使用企业自动化、框架、复杂页面标准方案

你对浏览器都进行过什么操作,分别是什么方法

1. 窗口与导航操作

  • 打开网址:driver.get(url)
  • 后退:driver.back()
  • 前进:driver.forward()
  • 刷新页面:driver.refresh()
  • 获取当前 url:driver.current_url
  • 获取标题:driver.title

2. 窗口标签页操作

  • 获取当前窗口句柄:driver.current_window_handle
  • 所有窗口句柄:driver.window_handles
  • 切换窗口:driver.switch_to.window(句柄)
  • 设置窗口大小:driver.set_window_size(width,height)
  • 最大化:driver.maximize_window()
  • 最小化:driver.minimize_window()

3. iframe / 弹窗切换

  • 切换 iframe:driver.switch_to.frame(元素/id/下标)
  • 退出 iframe 回到主页面:driver.switch_to.default_content()
  • 切换 alert 弹窗:alert = driver.switch_to.alert
  • 弹窗确认:alert.accept()取消:alert.dismiss()获取文本:alert.text

4. 元素交互操作

  • 点击:ele.click()
  • 输入文字:ele.send_keys("内容")
  • 清空输入框:ele.clear()
  • 获取文本:ele.text
  • 获取属性:ele.get_attribute("value")
  • 判断是否可见 / 启用 / 选中:is_displayed()/is_enabled()/is_selected()

XPath定位元素时,绝对路径和相对路径有什么区别?

1. 绝对路径

从根节点 html 一层一层写完整路径,以/开头 示例:/html/body/div[2]/div/main/div/form/input缺点:

  1. 层级轻微改动(新增一层 div、调整顺序)直接定位失败;
  2. 路径超长,可读性极差;
  3. 页面结构稍变脚本直接崩溃,禁止在项目使用。

2. 相对路径

//开头,全局匹配任意位置的目标元素,不依赖完整层级 示例://input[@id="username"]//div[contains(@class,"login-box")]//text()[contains(.,"登录")]优点:

  1. 只匹配关键属性 / 文本,中间层级变化不影响;
  2. 简短、易维护、稳定;
  3. 支持文本匹配、模糊匹配、轴定位,适配动态页面; 企业自动化统一使用相对 XPath。

如何使用Selenium选则文件?

原生 input type="file"(最简单,无弹窗)
文件上传本质是给隐藏 file 输入框传入本地文件路径,无需操作系统弹窗

# 定位file输入框,直接send_keys传入本地绝对路径 file_input = driver.find_element(By.CSS_SELECTOR, 'input[type="file"]') # 传入本地文件完整路径 file_input.send_keys(r"C:\test\demo.jpg")

作业

# 进入然知系统,跳转到该页面后操作 # 页面的加载全部使用显式等待 # 输入正确的成员信息,点击保存,跳转到如下页面代表保存成功,将该页面截图保存 import time from selenium import webdriver from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.select import Select from selenium.webdriver.support.wait import WebDriverWait #获取驱动 driver = webdriver.Edge() # 使用驱动打开然知 driver.get("http://127.0.0.1/ranzhi/www") # 隐式等待 driver.implicitly_wait(1) # 登录 driver.find_element("id",'account').send_keys("admin") driver.find_element("id",'password').send_keys("123456") locator = ("id","submit") WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)).click() driver.implicitly_wait(1) # 定位元素,使用显式等待,点击后台管理 locator = ("id","s-menu-superadmin") WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)).click() # 定位iframe i = driver.find_element("id","iframe-superadmin") # 切换到iframe中 driver.switch_to.frame(i) # 点击添加成员 locator = ("link text","添加成员") WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)).click() # 添加用户名 driver.find_element("id",'account').send_keys("tom2") # 添加真实姓名 driver.find_element("id",'realname').send_keys("张泽3") # 选择性别 driver.find_element("id",'genderm').click() # 选择部门 # 下拉框:创建select对象 a = driver.find_element("id","dept") select = Select(a) # 根据文本选中 select.select_by_visible_text("/市场部") # 选择角色 # 下拉框:创建select对象 b = driver.find_element("id","role") select = Select(b) # 根据文本选中 select.select_by_visible_text("项目经理") # 添加密码 driver.find_element("id",'password1').send_keys("123456") # 重复密码 driver.find_element("id",'password2').send_keys("123456") # 添加邮箱 driver.find_element("id",'email').send_keys("15845214561@163.com") # 点击保存 locator = ("id",'submit') WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)).click() time.sleep(10) # 截图 filename = time.strftime("%Y%m%d%H%M%S",time.localtime()) driver.save_screenshot(f'xinqidian_ranzhi_index_{filename}.png') driver.switch_to.default_content() # 签退 locator = ("link text",'签退') WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locator=locator)).click()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询