4.下拉选择框,弹出框。滚动条,(frame切换、多窗口切换,很重要,常用)等等,面试重要

本文介绍了Selenium在自动化测试中对网页元素的常见操作,如下拉选择框、弹出框、滚动条、frame切换、多窗口切换、窗口截图以及验证码处理。详细讲解了CSS选择器、Select类的选择框操作,以及如何处理警告框、滚动条滚动、frame的切换。此外,还探讨了多窗口切换、截屏功能和验证码的应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

target

  1. 下拉选择框——seleuim有专门的类
  2. 弹出框
  3. 滚动条操作
  4. frame 表单切换
  5. 多窗口切换
  6. 窗口截图
  7. 验证码处理

下拉选择框

css 里的option选择框

css

# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\xxx"
driver.get(url)


"""
    目标: 默认北京A
        暂停2秒
        1. 定位 A上海
        2. 暂停2秒
        3. 定位 A广州
"""
"""方式1:使用CSS定位"""
sleep(2)
# 使用css定位来操作 A上海
driver.find_element_by_css_selector("[value='sh']").click()
sleep(2)
# 使用css定位 A广州
driver.find_element_by_css_selector("[value='gz']").click()




# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

select 选择框,三种方法

  1. 下标访问
  2. value 值访问
  3. 显示文本切换
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
from selenium.webdriver.support.select import Select

driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册A.html"
driver.get(url)


"""
    目标: 使用Select类实现操作option选项
    
    需求:
        暂停2秒
        1. 定位 A上海
        2. 暂停2秒
        3. 定位 A广州
        
    步骤:
        1. 导包 Select类
        2. 获取Select对象
            匿名:Select(element).select_by_index() # 通过下标
            实名:select = Select(element)
                调用:select.select_by_index()
    注意:
        1. Select类是通过select标签来控制其下的option元素
        2. element:只能是select标签
"""
"""方式2:使用Select完成需求"""
el = driver.find_element_by_css_selector("#selectA")
sleep(2)
"""通过 下标形式访问"""
# 切换 上海
# Select(el).select_by_index(1)
# sleep(2)
# Select(el).select_by_index(2)

"""通过 value值形式访问"""
# 获取Select引用对象
# sel = Select(el)
# 切换 上海
# sel.select_by_value("sh")
# sleep(2)
# 切换 广州
# sel.select_by_value("gz")

"""通过 显示文本切换"""
sleep(2)
# 切换 上海
Select(el).select_by_visible_text("A上海")
sleep(2)
# 切换广州
Select(el).select_by_visible_text("A广州")

# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

为什么使用select 类?
如果 option 选项没有 value 值的话, css 定位或者其他定位就不太方便

方法:

  1. 导包 :from selenium.webdriver.support.select import Select
  2. 实例化s = Select(element)
  3. 调用方法s.select_by_index()
    调用方法有三种:
    索引、value值、显示文本

注意

  1. 实例化 select 类的时候,需要参数为 select 标签元素
  2. 调用Select 类下面的方法,是通过 索引 、value值、显示文本 来控制的,不需要click

弹出框—— driver.switch_to.alert

网页中常用的弹出框有三种

  1. alert 警告框
  2. confirm 确认框
  3. prompt 提示框

弹出框不处理的话,接下来的操作就不会生效

需求:打开注册A.html页面,完成以下操作:
1).点击 alert 按钮
2).关闭警告框
3).输入用户名:admin
1. 按钮被点击后弹出警告框,而接下来输入用户名的语句没有生效
2. 什么问题导致的?
3. 如何处理警告框?
说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样
1. 获取弹出框对象
alert = driver.switch_to.alert
2. 调用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
# 定位alerta按钮
driver.find_element_by_id("alerta").click()
# 获取警告框
alert = driver.switch_to.alert

# 注意:要打印弹出文本的话,需要在后面写上后续操作
# 获取文本 ,没有括号

# 打印警告框文本
print(alert.text)
# 接受警告框
alert.accept()
# 取消警告框
# alert.dismiss()

滚动条

滚动条:一种可控制页面显示范围的组件

作用:
1. 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
2. 页面注册同意条款,需要滚动条到最底层,才能点击同意

实现方式
说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。

需求:打开注册页面A,暂停2秒后,滚动条拉到最底层
# 最底层
 
# 第一步: 设置 js 控制滚动条语句 左边距 上边距
# 第二部:调用执行 js 语句方法
js1 = "window.scrollTo(0,10000)"
driver.execute_script(js1)
# 最顶层
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)



  1. JavaScript如何控制滚动条?—— js1 = "window.scrollTo(0,10000)"
  2. Selenium执行JavaScript脚本的方法?——driver.execute_script(js1)

frame切换—— 重要

常用的 frame 表单—— frame 和 iframe

不切换到话,当前主目录 没有 iframe 表单页面元素信息 ,不切换的话,找不到元素

frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素;
形式一:[了解]
<frameset cols="25%,75%">
<frame src="frame_a.htm">
<frame src="frame_b.htm">
</frameset>
形式二:
<iframe name="iframe_a" src="demo_iframe.htm" width="200" height="200"></iframe>
案例:打开‘注册实例.html’页面,完成以下操作
1). 填写主页面的注册信息
2). 填写注册页面A中的注册信息
3). 填写注册页面B中的注册信息
问题
1. 当前页面内无法定位注册页面A和注册页
说明:在Selenium中封装了如何切换frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法
在frame中操作其他页面,必须先回到默认页面,才能进一步操作

解决方法:

  1. 完成主页面注册信息;
  2. 调用frame切换方法(switch_to.frame(“myframe1”))切换到注册用户A框架中
  3. 调用恢复默认页面方法(switch_to.default_content())
  4. 调用frame切换方法(switch_to.frame(“myframe2”))切换到注册用户B框架中
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
# driver.implicitly_wait(30)
# 打开url
url = r"xxx"
driver.get(url)


"""
    目标: 为什么要切换frame表单
    需求:
        1. 打开注册实例.html
        2. 填写主页面 页面信息
        3. 填写注册A 页面信息
        4. 填写注册B 页面信息
    
"""
"""填写主页面"""
# 用户名
driver.find_element_by_css_selector("#user").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#password").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".tel").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#email").send_keys("123@qq.com")

# 切换到注册A 使用name
# driver.switch_to.frame("myframe1")
# 使用id
driver.switch_to.frame("idframe1")

"""填写注册A"""
# 用户名
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordA").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telA").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailA").send_keys("123@qq.com")

# 切换到默认目录—— 因为 A 页面,没有frame 表单,所以需要切换
driver.switch_to.default_content()

# 切换到注册B 使用name
# driver.switch_to.frame("myframe2")
# 使用元素切换
driver.switch_to.frame(driver.find_element_by_css_selector("[name='myframe2']"))



"""填写注册B"""
# 用户名
driver.find_element_by_css_selector("#userB").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordB").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telB").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailB").send_keys("123@qq.com")



# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

xx:
1.HTML中常用的frame框架——frame 和 iframe
2. 切换框架的方法—— driver.switch_to.frame("idframe1")
3. 恢复到默认页面的方法—— driver.switch_to.default_content()
4. 切换 frame 时 ,可以使用 name id iframe 元素

多窗口切换

在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面。

案例:
需求:打开 ‘注册实例.html’ 页面,完成以下操作
1). 点击 ‘注册A页面’ 链接
2). 在打开的页面中,填写注册信息

实现多窗口切换的方法:
三个:

说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
句柄:英文handle,窗口的唯一识别码
方法:

1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
  1. 获取‘注册实例.html’当前窗口句柄
  2. 点击‘注册实例.html’页面中注册A页面
  3. 获取所有窗口句柄
  4. 获取注册A页面对应的窗口句柄,并切换
  5. 操作注册A页面元素
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
# driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册实例.html"
driver.get(url)


"""
    目标: 切换窗口
    需求:
        1. 打开注册实例.html
        2. 点击 注册A网页
        3. 填写 注册A网页 内容
        
        
    
"""

# 获取当前窗口句柄  -->目的:判断只要不是当前主窗口句柄,就一定时新开的窗口句柄
current_handle = driver.current_window_handle
print("当前窗口句柄为:", current_handle)
# 点击注册A网页
driver.find_element_by_partial_link_text("A网页").click()

# 获取所有窗口句柄
handles = driver.window_handles
print("所有窗口句柄:", handles)

# 判断 不是 当前窗口句柄
for h in handles:
    if h != current_handle:
        # 切换
        driver.switch_to.window(h)
        """填写注册A"""
        # 用户名
        driver.find_element_by_css_selector("#userA").send_keys("admin")
        # 密码
        driver.find_element_by_css_selector("#passwordA").send_keys("admin")
        # 电话
        driver.find_element_by_css_selector(".telA").send_keys("18611112222")
        # 邮件
        driver.find_element_by_css_selector("#emailA").send_keys("123@qq.com")


# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

总结;

  1. 什么是句柄?
  2. 获取当前窗口句柄方法
  3. 获取所有窗口句柄方法
  4. 切换指 定句柄窗口方法

截屏

把当前操作的页面,截图保存到指定位置
窗口截图是因为,自动化脚本是由程序去执行的,有时候打印的错误信息并不是十分明确,如果在执行出错的时候对当前窗口截图保存,那么图片就可以直观的看到出错的原因

方法:driver.get_screenshot_as_file(imgpath) ——imgpath 是图片保存的路径

# 导包
import time
from time import strftime
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册A.html"
driver.get(url)


"""
    目标: 截屏
    方法:
        driver.get_screenshot_as_file()
    需求:
        1. 输入用户名
        2. 截图 当前目录下 admin.png
"""
# 输入 admin
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 调用截图方法
# driver.get_screenshot_as_file("./admin.png")
# 存放指定目录
# driver.get_screenshot_as_file("../scripts/admin02.png")
# driver.get_screenshot_as_file("../image/admin.png")

# 动态获取文件名称 使用时间戳
# driver.get_screenshot_as_file("../image/%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
# driver.get_screenshot_as_file("../image/%s.jpg"%(time.strftime("%Y_%m_%d %H_%M_%S")))
driver.get_screenshot_as_file("../image/%s.jpg"%(strftime ("%Y_%m_%d %H_%M_%S")))



# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

验证码

一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性

学习验证码的目的:在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时候,
就需要面临处理验证码的问题。

面试问题:验证码处理方式:
答:说明:Selenium中并没有对验证码处理的方法,在这里我们介绍一下针对验证码的几种常用处理方式
方式:
1). 去掉验证码 (测试环境下-采用,公司自己的项目)
2). 设置万能验证码 (生产环境和测试环境下-采用)
3). 验证码识别技术 (通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie (通过记录cookie进行跳过登录)

cookie

1. Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
2. Cookie数据格式:键值对组成(python中的字典)
3. Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie
数据
4. Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务
器检
查该Cookie,以此来辨认用户状态。

cookie的应用场景

1. 实现会话跟踪,记录用户登录状态
2. 实现记住密码和自动登录的功能
3. 用户未登录的状态下,记录购物车中的商品

Selenium操作cookie
说明:Selenium中对cookie操作提供相应的方法
方法:

cookie 的返回结果是一个 列表

1. get_cookie(name) --> 获取指定cookie
name:为cookie的名称
2. get_cookies() --> 获取本网站所有本地cookies
3. add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一个字典对象,必选的键包括:"name" and "value"
需求:使用cookie实现跳过登录
1). 手动登录百度,获取cookie
2). 使用获取到的cookie,达到登录目的,然后就可以执行登录之后的操作

BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到帐号的控制权,
通行贴吧、知道、百科、文库、空间、百度云等百度主要产品。
1. 登录baidu,登录成功后抓取 (BDUSS)
2. 使用add_cookie()方法,添加 (BDUSS)键和值
3. 调用刷新方法 driver.refresh()
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.add_cookie({'name':'BDUSS','value':'根据实际填写'})
time.sleep(3)
driver.refresh()
time.sleep(3)
driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值