contents
from selenium.webdriver import Chrome
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver=Chrome(options=options)
frame/窗口 切换
frame切换
在html语法中,frame元素或者iframe元素的内部会包含一个被嵌入的 另一份html文档。而selenium对打开网页的操作范围默认是当前的html和frame(iframe)本身, 并不包含被嵌入的html文档里面的内容。
要操控被嵌入frame(iframe)里的 html文档中的元素, 就必须切换操控范围到被嵌入的文档中。
用WebDriver的switch_to切换
- 进入frame(iframe):
driver.switch_to.frame(frame_reference)
写在要定位frame里的元素之前。后续选择和操作界面元素就都是在这个frame里面的元素。
frame_reference | 代码示例 |
---|---|
属性name | driver.switch_to.frame(“name值”) |
ID | driver.switch_to.frame(“ID值”) |
WebElement 对象(find系列的方法定位元素) | driver.switch_to.frame(driver.find_element(By.ID,“ID值”)) |
- 切换回原来的主html:
driver.switch_to.default_content()
后续选择和操作界面元素都会在原来的主html中(frame之外)进行。
窗口切换
在网页上操作的时候,点击一个链接或者按钮,有时会打开一个新窗口,但这时WebDriver对象对应的还是老窗口,即自动化操作也还是在老窗口进行。
用WebDriver的switch_to切换
此时点击了元素,浏览器有了新窗口,进入新窗口:
- step1:通过WebDriver的window_handles 属性
driver.window_handles
得到当前浏览器所有窗口句柄(网页窗口的ID)的列表对象。 - step2:对列表中的每个句柄,调用
driver.switch_to.window(handle)
方法切入到每个窗口,其中handle即为每个句柄。 - step3:检测切入窗口对象的属性(可以是标题栏
driver.title
,地址driver.current_url
栏等),判断是否为目标窗口,若是,就跳出循环。继续对该窗口内的元素进行操作。
for handle in driver.window_handles:
# 先切换到该窗口
driver.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'littleyueyue' in wd.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
#继续对该窗口内的元素进行操作
返回原来的窗口:
-
方式1:
沿用上面的方法,利用WebDriver.window_handows得到当前浏览器的所有窗口句柄,循环遍历找到之前的浏览器。 -
方式2:
在切换进新窗口之前,用变量储存当前窗口mainWindow=driver.current_window_handle
之后要切回时,在新窗口中直接使用driver.switch_to.window(mainWindow)
即可
窗口关闭
若要关闭新窗口,则需要新的窗口中使用driver.close()
进行关闭,再使用driver.switch_to.window(mainWindow)
跳转回到原来的窗口
区别driver.quit()是关闭浏览器驱动
选择框
常见的选择框包括: radio框、checkbox框、select框
radio框
radio框的选择选项,先定位到要选择的元素,用webElement的click方法模拟用户点击即可。
由于radio框是单选框,所以选择了其一,原来选中的选项会自动取消。
补充知识:
输入框和radio框的tag都是input,但是输入框中type属性时未指定的,radio框的type值是radio
<input id="input1" value="请输入查询信息">
<input id="search" type="radio" value="科技" checked="checked">
(checked表示该选项是几个选项中默认选择的值)
checkbox框
由于checkbox框是多选框,为了保证只选择我们需要的选项,必须考虑到当前该复选框内的选中状态 ,若已勾选,就不再点击(否则反而会取消该选择)。
方案:
- step1:把已选中的选项都点击一遍,确保都是未选状态
elements_list=driver.find_elements(By.CSS_SELECTOR,'input[checked="checked"]')
for element in elements_list:
element.click()
- step2:点击目标选项
补充知识:
checkbox框的tag也是input,但是checkbox框的type值是checkbox
<input id="search" type="checkbox" value="科技" checked="checked">
selecet 框
可多选的select框会多一个multiple属性,如<select id="search" multiple>
针对Select 选择框Selenium 专门提供了Select类进行操作。
示例:<option value="科技">大数据</option>
先导入Select类,再创建Select对象,参数select框的webElement对象,注意是定位到select框不是具体选项。
from selenium.webdriver.support.ui import Select
select = Select(wd.find_element(定位到select框))#
select类方法 | 说明 | 代码 |
---|---|---|
select_by_value | 根据选项的 value值 | Select.select_by_value(‘科技’) |
select_by_index | 根据选项的次序 (从0开始) | |
select_by_visible_text | 根据选项的可见文本 | Select.select_by_visible_text(‘大数据’) |
deselect_by_value | 根据选项的value属性值去除选中元素 | |
deselect_by_index | 根据选项的次序,去除选中元素 | |
deselect_by_visible_text | 根据选项的可见文本去除选中元素 | |
deselect_all | 去除选中所有元素 |
补充知识:
select框的tag是select<select id="search" >
,具体每个选项的标签是option。
select单选框
不管原来选的是什么,直接用Select类中的方法进行选择即可。
前提:
- 导入了Select类
from selenium.webdriver.support.ui import Select
- 传入select的参数为select框的webElement
select多选框
和CheckBox框一样,要先考虑当前该框内的选中状态。
方案:
- step1:用Select类中的
deselect_all()
,清除所有已经选中的选项 - step2:用Select类中的方法进行选择
元素操控
之前在selenium爬虫入门(1)中学习了用find_element()
选择元素,用WebElement的.click()
点击元素,还有WebElement的.send_keys()
输入字符串。
为了进行更多操作,我们现在来学习一下 Selenium的ActionChains 类。首先,导入
from selenium.webdriver.common.action_chains import ActionChains
ac=ActionChain(driver)
模拟鼠标移动
用ActionChain的move_to_element()方法实现ac.move_to_element(driver.find_element(定位元素)).perform()
。必须调用perfem()才能执行。
当然除了移动鼠标,还有很多操作,比如按住鼠标不松开click_and_hold,双击double_click,右击context_click,键盘按住补送key_down
冻结界面
有时候鼠标的移动会导致界面的变化,难以查看元素的定位信息,所以需要暂时冻结界面。
打开网页的开发者工具,选择控制(console),输入js代码
setTimeout(function(){debugger}, 5000)
debugger 命令会使浏览器会进入debug状态,界面被冻住,不管怎么点击界面都不会触发事件。而5000表示5000毫秒后,执行debugger命令。
冻住之后需要网站进行运行则点击此处: