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类 进行操作。
- 根据选项的 value属性值 ,选择元素。
select_by_value
- 根据选项的 次序 (从0开始),选择元素
select_by_index
- 根据选项的 可见文本 ,选择元素。
select_by_visible_text
- 根据选项的value属性值, 去除 选中元素
deselect_by_value
- 根据选项的次序,去除 选中元素
deselect_by_index
- 根据选项的可见文本,去除 选中元素
deselect_by_visible_text
- 去除 选中所有元素
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