智能体测开Day29 浏览器的操作 回退 前进 浏览器窗口的最大化 浏览器窗口的最小化 浏览器窗口的关闭 退出 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(locatorlocator)) 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(fxinqidian_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)背诵内容定位方法有哪些idfind_element (By.ID, id 值)namefind_element (By.NAME, name 值)class_name单一 class不能多类名tag_name标签名如 div、inputlink_text完整匹配超链接文字partial_link_text模糊匹配链接文字xpath路径定位最灵活通用css_selectorcss 选择器性能优于 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()获取当前 urldriver.current_url获取标题driver.title2. 窗口标签页操作获取当前窗口句柄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 / 弹窗切换切换 iframedriver.switch_to.frame(元素/id/下标)退出 iframe 回到主页面driver.switch_to.default_content()切换 alert 弹窗alert driver.switch_to.alert弹窗确认alert.accept()取消alert.dismiss()获取文本alert.text4. 元素交互操作点击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缺点层级轻微改动新增一层 div、调整顺序直接定位失败路径超长可读性极差页面结构稍变脚本直接崩溃禁止在项目使用。2. 相对路径以//开头全局匹配任意位置的目标元素不依赖完整层级 示例//input[idusername]//div[contains(class,login-box)]//text()[contains(.,登录)]优点只匹配关键属性 / 文本中间层级变化不影响简短、易维护、稳定支持文本匹配、模糊匹配、轴定位适配动态页面 企业自动化统一使用相对 XPath。如何使用Selenium选则文件原生 input typefile最简单无弹窗文件上传本质是给隐藏 file 输入框传入本地文件路径无需操作系统弹窗# 定位file输入框直接send_keys传入本地绝对路径 file_input driver.find_element(By.CSS_SELECTOR, input[typefile]) # 传入本地文件完整路径 file_input.send_keys(rC:\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(locatorlocator)).click() driver.implicitly_wait(1) # 定位元素使用显式等待点击后台管理 locator (id,s-menu-superadmin) WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locatorlocator)).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(locatorlocator)).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(15845214561163.com) # 点击保存 locator (id,submit) WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locatorlocator)).click() time.sleep(10) # 截图 filename time.strftime(%Y%m%d%H%M%S,time.localtime()) driver.save_screenshot(fxinqidian_ranzhi_index_{filename}.png) driver.switch_to.default_content() # 签退 locator (link text,签退) WebDriverWait(driver,5,0.3).until(expected_conditions.presence_of_element_located(locatorlocator)).click()