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 webdriverimport 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('')# 定位元素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('')# 定位元素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对象就是对应的该该窗口,正好,跳出循环,breakprint(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('')# 定位元素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_handlefor handle in wb.window_handles:# 先切换到该窗口wb.switch_to.window(handle)# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口if '自动化工具' in wb.title:# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,breakprint(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属性值 ,选择元素。
根据选项的 次序 (从0开始),选择元素select_by_value
根据选项的 可见文本 ,选择元素。select_by_index
根据选项的value属性值, 去除 选中元素select_by_visible_text
根据选项的次序,去除 选中元素deselect_by_value
根据选项的可见文本,去除 选中元素deselect_by_index
去除 选中所有元素deselect_by_visible_text
deselect_all
3.1 Select单选框
直接用Select方法选择即可。
from selenium import webdriverfrom 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 webdriverfrom 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('小雷老师')
参考博客:/tut/auto/selenium/02/
参考视频:/video/BV1Z4411o7TA?p=9