Web自动化测试Selenium(4)frame切换/窗口切换/选择框-2021-10-09

1. frame切换

1.1 问题描述

选择 class 属性值为 plant 的元素。

elements = wb.find_element_by_css_selector('.plant')

在这里插入图片描述
表示返回的elements的列表为空。

通过查看开发者模式可以看出这些元素是在一个叫 iframe的 元素中的。
在这里插入图片描述

1.2 frame 简介

iframe 元素非常的特殊, 在html语法中,frame 元素 或者iframe元素的内部 会包含一个 被嵌入的 另一份html文档。

在我们使用selenium打开一个网页是, 我们的操作范围 缺省是当前的 html , 并不包含被嵌入的html文档里面的内容。

1.3 frame 跳转

如果我们要 操作 被嵌入的 html 文档 中的元素, 就必须 切换操作范围 到 被嵌入的文档中。

wd.switch_to.frame(frame_reference)

其中iframe元素的id ‘frame1’ 或者 name属性值 ‘innerFrame’。
若没有上述属性,可以使用Webelement对象,使用 wb.find_elements_by_css_selector(’[src=“sample1.html”]’)
在这里插入图片描述

在这里插入图片描述

from selenium import webdriver
import traceback
# 启动浏览器
wb = webdriver.Chrome(r'')

# 设置最大等待时长为 10秒
wb.implicitly_wait(10)

# 打开网址
wb.get('http://cdn1.python3.vip/files/selenium/sample2.html')

# 隐式等待
wb.implicitly_wait(10)

try:
   # 跳转HTML
    
    # 1. 根据id选择
    #wb.switch_to.frame('frame1')
    
    # 2. 根据Webelement对象进行选择,Webelement对象通过css selector 进行选择。
    wb.switch_to.frame(wb.find_element_by_css_selector('iframe[src="sample1.html"]'))
    
    # css选择器
    elements = wb.find_elements_by_css_selector('.plant')
except:
    info = traceback.format_exc()
    print(info)
else:
    for i in elements:
        print(i.text)
finally:
    wb.close()

在这里插入图片描述
这时切换到某个iframe里面进行操作了,那么后续选择和操作界面元素 就都是在这个frame里面进行的。怎么切换回原来的主html呢?

wd.switch_to.default_content()

wb.switch_to.default_content()
element = wb.find_element_by_css_selector('.baiyueheiyu')
print(element.text)

在这里插入图片描述

2. 窗口切换

在网页上操作的时候,我们经常遇到,点击一个链接 或者 按钮,就会打开一个 新窗口, Selenium写自动化程序 在新窗口里面 打开一个新网址, 并且去自动化操作新窗口里面的元素.

from selenium import webdriver

# 启动浏览器
wb = webdriver.Chrome(r'')

# 设置隐式等待时间
wb.implicitly_wait(5)

# 搜索
wb.get('https://www.baidu.com')

# 定位元素
element = wb.find_element_by_id('kw')

# 搜索
element.send_keys('selenium')

# 定位百度按钮并点击
wb.find_element_by_id('su').click()

# 定位第二个连接
wb.find_element_by_css_selector('div[id="content_left"]>div>h3>a')[1].click()

print(wb.title)

在这里插入图片描述
显示仍为老窗口。
跳转新窗口

wd.switch_to.window(handle)

WebDriver对象有window_handles 属性,这是一个列表对象, 里面包括了当前浏览器里面所有的窗口句柄

from selenium import webdriver

# 启动浏览器
wb = webdriver.Chrome(r'')

# 设置隐式等待时间
wb.implicitly_wait(5)

# 搜索
wb.get('https://www.baidu.com')

# 定位元素
element = wb.find_element_by_id('kw')

# 搜索
element.send_keys('selenium')

# 定位百度按钮并点击
wb.find_element_by_id('su').click()

# 定位第二个连接
wb.find_elements_by_css_selector('div[id="content_left"]>div>h3>a')[1].click()

for handle in wb.window_handles:
    # 先切换到该窗口
    wb.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if '自动化工具' in wb.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

print(wb.title)

在这里插入图片描述

如果跳回原来的页面。
方法1. 继续遍历所有的话柄,然后找到跳转之前的网页,再进行跳转。
方法2. 可以保存老窗口的话柄

mainWindow变量保存当前窗口的句柄

mainWindow = wd.current_window_handle

通过前面保存的老窗口的句柄,自己切换到老窗口

wd.switch_to.window(mainWindow)

from selenium import webdriver

# 启动浏览器
wb = webdriver.Chrome(r'')

# 设置隐式等待时间
wb.implicitly_wait(5)

# 搜索
wb.get('https://www.baidu.com')

# 定位元素
element = wb.find_element_by_id('kw')

# 搜索
element.send_keys('selenium')

# 定位百度按钮并点击
wb.find_element_by_id('su').click()

# 定位第二个连接
wb.find_elements_by_css_selector('div[id="content_left"]>div>h3>a')[1].click()
mainWindow = wb.current_window_handle
for handle in wb.window_handles:
    # 先切换到该窗口
    wb.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if '自动化工具' in wb.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

print(wb.title)
wb.switch_to.window(mainWindow)
print(wb.title)


在这里插入图片描述

3. 选择框

3.1 radio 选择框

在这里插入图片描述
在这里插入图片描述
radio框选择选项,直接用WebElement的click方法,模拟用户点击就可以了。

from selenium import webdriver

# 启动浏览器
wb = webdriver.Chrome(r'')

# 隐式等待
wb.implicitly_wait(3)

# 输入网址
wb.get('http://cdn1.python3.vip/files/selenium/test2.html')

# 获取当前选中元素
element = wb.find_element_by_css_selector('#s_radio input[checked="checked"]')
print(element.get_attribute('value'))

# 点选 小雷老师
wb.find_element_by_css_selector('#s_radio input[value="小雷老师"]').click()


在这里插入图片描述

3.2 checkbox选择框

在这里插入图片描述
在这里插入图片描述

对checkbox进行选择,也是直接用 WebElement 的 click 方法,模拟用户点击选择

存在问题:
需要注意的是,要选中checkbox的一个选项,必须 先获取当前该复选框的状态 ,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。
解决思路:

  • 先把 已经选中的选项全部点击一下,确保都是未选状态

  • 再点击 小雷老师

from selenium import webdriver

# 启动浏览器
wb = webdriver.Chrome(r'')

# 隐式等待
wb.implicitly_wait(3)

# 搜索网页
wb.get('http://cdn1.python3.vip/files/selenium/test2.html')

# 定位已选元素
elements = wb.find_elements_by_css_selector('#s_checkbox input[checked="checked"]')

# 把已选元素,重新点击,还原成未选状态
for element in elements:
    element.click()

elements = wb.find_element_by_css_selector('#s_checkbox input[value="小江老师"]').click()

3.3 select 选择框

在这里插入图片描述
radio框及checkbox框都是input元素,只是里面的type不同而已。
对于Select 选择框, Selenium 专门提供了一个 Select类 进行操作。
在这里插入图片描述

  1. 根据选项的 value属性值 ,选择元素。

select_by_value

  1. 根据选项的 次序 (从0开始),选择元素

select_by_index

  1. 根据选项的 可见文本 ,选择元素。

select_by_visible_text

  1. 根据选项的value属性值, 去除 选中元素

deselect_by_value

  1. 根据选项的次序,去除 选中元素

deselect_by_index

  1. 根据选项的可见文本,去除 选中元素

deselect_by_visible_text

  1. 去除 选中所有元素

deselect_all

3.1 Select单选框

直接用Select方法选择即可。

from selenium import webdriver
from selenium.webdriver.support.ui import Select

# 启动浏览器
wb = webdriver.Chrome(r'C:\Users\Lenono\Desktop\Test_Learning\chromedriver_win32\chromedriver.exe')

# 隐式等待
wb.implicitly_wait(3)

# 搜索网站
wb.get('http://cdn1.python3.vip/files/selenium/test2.html')

# 创建Select类
select = Select(wb.find_element_by_id('ss_single'))

# 通过Select对象选中小江老师
select.select_by_visible_text('小江老师')

3.2 Select多选框

对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。
可以用select类 的deselect_all方法,清除所有 已经选中 的选项。
然后再通过 select_by_visible_text方法 选择 小雷老师 和 小凯老师。

from selenium import webdriver
from selenium.webdriver.support.ui import Select

# 启动浏览器
wb = webdriver.Chrome(r'')

# 隐式等待
wb.implicitly_wait(3)

# 搜索网站
wb.get('http://cdn1.python3.vip/files/selenium/test2.html')

# 创建Select类
select = Select(wb.find_element_by_id('ss_multi'))

# 去除所有的选项
select.deselect_all()

# 通过Select对象选中小江老师
select.select_by_visible_text('小江老师')
select.select_by_visible_text('小雷老师')

参考博客:http://www.byhy.net/tut/auto/selenium/02/
参考视频:https://www.bilibili.com/video/BV1Z4411o7TA?p=9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值