selenium实战中,我们常常会遇到各种各样的问题,比如弹窗啊,验证码需要鼠标点击后才会出现等问题,下面,我把常遇到的问题整理出来
1.模拟鼠标操作
通过selenium提供的actionchains模块,可以实现模拟鼠标操作
使用前需导入方法:from selenium.webdriver.common.action_chains import ActionChains
要调用这个类,首先需要实例化这个类,这里用点击举例,具体写法如下:
a=ActionChains(self.web) #参数就是webdriver的对象
a.move_to_element(self.web.find_element(By.ID,"su")).click()
#模拟数据点击,move_to_element里面需要传入一个元素,这里要用选择元素的方法去写,不然无法识别元素
![]()
剩下的就不一一举例了,都写在下面,可以根据具体需要选择对应方法
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素,但不操作
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置,但不操作
perform() ——执行链中的所有动作,执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作,每次代码必须加这个
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
2.操作插件日历时间
这里用12306举例子
首先打开需要修改日历的页面的调试器,我们这里用12305做实验,查看时间的元素,这里看到日历的id元素是train_date,打开控制台,输入document.getElenemtById(“train_date”),获取元素的id值为train_date的文件,这里打印出来看到,通过value可以控制时间,所以.value=“”,输入我们需要的时间即可修改
在程序中通过JavaScriptself.web.execute_async_script()这个方法去执行JavaScript, 具体写法如下
![]()
3.弹出框的处理
常见的弹出框分为三种,分别是alert(警告信息),confirm(确认信息),prompt(提示输入),这三种弹出框是不能直接获取元素的,下面就讲解这三种对话框的信息处理
alert弹窗
如下图,这种弹出框如何确认
![]()
用 self.web.switch_to.alert.accept() 方法,表示确定弹窗
![]()
confirm对话框
如下图分为确认和取消两个按钮,确认操作和上面一致,那么如何取消呢
![]()
可以用self.web.switch_to.alert.dismiss() 方法取消弹窗
![]()
prompt:输入框
如下图这种输入框,该如何输入内容呢
![]()
可以通过self.web.switch_to.alert.send_keys() 输入内容,然后再点击确认或者取消
![]()
把上面的内容总结一下,如下文
获取文本:switch_to.alert.test
点击弹窗的确认按钮:switch_to.alert.accept()
点击弹窗的取消按钮:switch_to.alert.dismiss()
输入文本信息:switch_to.alert.send_keys()
4.上传文件
有时候,网站操作需要上传文件,才能进行下一步,该怎么处理呢
通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。
如下所示:
<input type="file" multiple="multiple">
使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可。
如下所示:
# 先定位到上传文件的 input 元素 ele = wd.find_element_by_css_selector('input[type=file]') # 再调用 WebElement 对象的 send_keys 方法 ele.send_keys(r'h:\g02.png')
如果需要上传多个文件,可以多次调用send_keys,如下
ele = wd.find_element_by_css_selector('input[type=file]') ele.send_keys(r'h:\g01.png') ele.send_keys(r'h:\g02.png')
5. frame切换/窗口切换
iframe元素非常特殊,在html语法中,frame元素或者iframe元素的内部会包含一个 被嵌入的另一份html文档,如果要访问iframe中的内容,就需要上面的switch_to方法
如下图,这种iframe框架中的元素该如何选中
![]()
可以通过self.web.switch_to.frame(frame_reference="") #其中frame_reference 可以是 frame 元素的属性 name 或者 ID
![]()
如果iframe框架后面既没有id,也没有name,那么也可以填写frame 所对应的 WebElement 对象
如图,如果不用id和name怎么获取,可用src等方法:a.switch_to.frame(a.find_element_by_css_selector('[src="sample1.html"]'))
如果想再操作iframe框架外面的内容就用 self.web.switch_to.default_content()
![]()
6. 选择框
常见的选择框分为radio框:原点式的选择框,checkbox:复选框, select:下拉框和多选框,当遇到选择框,我们应该如何操作呢
radio原点式选择框,如下图
![]()
直接通过选择元素,然后click点击元素就行
![]()
checkbox复选框,和radio选择框一样
![]()
需要注意的是,要选中checkbox的一个选项,必须 先获取当前该复选框的状态 ,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。
如果有默认选中的话我们就要:
1.先把 已经选中的选项全部点击一下,确保都是未选状态
c=a.find_elements_by_css_selector('#s_checkbox>[checked="checked"]')
for i in c:
i.click()
2.再点击 需要选中的选项
a.find_element_by_css_selector('#s_checkbox>input[value="小雷老师"]').click()
![]()
select复选框
radio框及checkbox框都是input元素,只是里面的type不同而已。select框 则是一个新的select标签
![]()
Select类 提供了如下的方法:
select选择框提供了select_by_value,select_by_index,selct_by_visible_text,三种方法
根据选项的value属性值, 去选中元素:select_by_value
根据选项的次序,去选中元素:deselect_by_index
根据选项的可见文本,去选中元素:deselect_by_visible_text
![]()
select多选框
选框,可以选择要选中某几个选项,注意:如果有默认选中值,要注意去掉原来已经选中的选项
清除所有选中内容:deselect_all()
# 导入Select类 from selenium.webdriver.support.ui import Select
# 创建Select对象 select = Select(wd.find_element_by_id("ss_multi"))
# 清除所有 已经选中 的选项 select.deselect_all()
# 选择小雷老师 和 小凯老师 select.select_by_visible_text("小雷老师") select.select_by_visible_text("小凯老师")
![]()
7.调整窗口大小
获取窗口大小:driver.get_window_size()
改变窗口大小:driver.set_window_size(x, y)
窗口最大化:driver.maximize_window()
![]()
8. 获取当前窗口标题和url信息
浏览网页的时候,我们的窗口是不断变化的,要如何定位当前窗口的位置呢,可以通过webDriver的title属性来获取当前窗口的标题
获取标题:title
获取当前窗口的URL地址:current_url
![]()
9. 截屏
再我们执行程序的过程中,如果遇到错误该如何处理,我们可以把错误的页面截屏截取下来,方便后期查看
方法:get_screenshot_as_file() 括号里面写文件路径和文件名,文件名自定义但是需要用.png结尾,才能识别。文件路径需要写存在的路径
![]()
10.窗口切换
但我们访问页面,切换到新窗口操作的时候,改如何定位到新窗口呢,这时候,就可以通过句柄定位到新窗口
写法: window_handles
# 找出新窗口:
:a=self.web.window_handles[-1] # '-1'代表打开的最后一个窗口
# 切换到新窗口
self.web.switch_to.window(a)
![]()