本篇学习总结 webdriver 模块操作浏览器, Cookie, 鼠标键盘, 警示框, 设置等待时间, 多窗口切换等方法的使用
1 浏览器控制
Selenium-webdriverAPI 提供了对页面元素定位和操作方法外, 还提供了对浏览器本身的操作, 如浏览器前进, 后退, 刷新, 关闭, 浏览器窗口大小设置等
1.1 控制浏览器窗口大小
Selenium-webdriverAPI 对浏览器窗口设置提供了 set_window_size(width,height) 方法, 第一个参数为宽度, 第二个参数为高度. 如将浏览器窗口设置成移动客户端的大小 480*800, 脚本为:
driver. set_window_size(480,800)
当然一般我们都希望打开浏览器后最大化窗口, Selenium-webdriverAPI 也提供了窗口最大化的方法
maximize_window()
1.2 控制浏览器前进, 后退, 关闭
有时我们经常操作浏览器页面前进, 后退以及关闭等操作, Selenium-webdriverAPI 提供了对应的 forword(),back(),quit(),close() 方法
其中 quit(),close() 方法, 不同的是 quit() 方法表示退出整个浏览器驱动, close() 表示退出当前的浏览器窗口
1.3 刷新浏览器
Selenium-webdriverAPI 提供刷新浏览器页面的方法为 refresh()
具体的各个方法使用, 如下面新建的 browser.py 脚本实例:
- '''
- Code description:
- Create time:
- Developer:
- '''
- # -*- coding: utf-8 -*-
- from selenium import webdriver
- import time
- driver = webdriver.IE()
- driver.get('https://www.baidu.com')
- driver.maximize_window() # 最大化窗口
- time.sleep(5)
- driver.set_window_size(480,800) # 设置窗口大小
- driver.back() # 浏览器后退
- driver.forward() # 浏览器前进
- time.sleep(5)
- driver.refresh() # 浏览器刷新
- driver.quit() # 浏览器退出
- # driver.close() # 关闭当前打开的浏览器页面
2 操作浏览器 cookie
Webdriver 提供了多种操作浏览器 cookie 的方法, 主要如下:
get_cookies()
该方法会获取浏览器所有的 cookie 信息, cookie 信息数据类型以字典的形式存放, 即 key-value 对的形式
get_cookie(name)
该方法会获取 cookie 数据中属性键值 name 的值的 cookie 信息, 其他键值数据信息不获取
add_cookie(cookie_dict)
该方法为添加 cookie, 由于我们知道 cookie 存放数据是以字典的形式, 故添加 cookie 时必须是键值对形式
delete_cookie(cookie_dict)
该方法为删除 cookie, 与 add 对应
delete_all_cookies()
该方法为删除所有的浏览器 cookie 信息
具体方法使用如下图, 新建 cookie.py 的脚本, 还是以 baidu.com 为例子
- '''
- Code description:
- Create time:
- Developer:
- '''
- # -*- coding: utf-8 -*-
- from selenium import webdriver
- driver = webdriver.IE()
- driver.get('https://www.baidu.com/')
- cookie = driver.get_cookies() # 获取所有的 cookie,cookie 数据以字典的形式存放
- print(cookie)
- print(driver.get_cookie('BAIDUID')) # get_cookie(name) 方法用来获取 cookie 键值 name 对应的值
- driver.add_cookie({'name': 'hello','value' : 'world'}) # 添加 cookie
- for cookie in driver.get_cookies():
- print(driver.get_cookie('hello'))
- driver.delete_cookie('hello') # 删除指定的 cookie
- # driver.delete_all_cookies() # 删除所有的 cookie
- driver.quit()
3 鼠标和键盘控制
在浏览网页是电脑和我们交互的就是鼠标和键盘了, 也是我们操作最多的. 鼠标在现在的网页上已经有诸多操作, 如单击, 右击, 双击, 悬浮, 拖拽等操作; 键盘用于输入, 有诸多输入键, 如 enter,backspace, 空格等以及诸多组合键的使用. Webdriver 对于鼠标和键盘也实现了比较多和详细的模拟实现方式, 主要由 webdriver 中封装的 ActionChains 类实现.
3.1 模拟鼠标操作
对于鼠标的操作, ActionChains 类主要提供了鼠标的右键, 双击, 悬浮, 拖拽等方法
具体的方法如下:
右击: context_click()
双击: double_click()
悬浮: move_to_element()
拖拽: drag_and_drop()
下面以百度网盘网页客户端来说明模拟鼠标的这些操作方法, 如下图选中一个文件夹后可以鼠标右键后有操作列表显示:
模拟实现鼠标右键操作来打开该文件夹, 代码如下:
- '''
- Code description:
- Create time:
- Developer:
- '''
- # -*- coding: utf-8 -*-
- from selenium import webdriver
- from selenium.webdriver.common.action_chains import ActionChains
- driver = webdriver.IE()
- driver.get('https://pan.baidu.com')
- '''
- 中间省略百度网盘的登陆过程脚本
- '''
- # 定位到 PyCharm 这个元素位置
- PyCharm = driver.find_element_by_xpath('//*[@id="layoutMain"]/div/div[2]/div/div[3]/div/div/dd/div[2]/div[1]')
- ActionChains(driver).context_click(PyCharm).perform()
- '''
- 调用 ActionChains() 方法, 传入 driver 浏览器参数, 类提供的鼠标右击操作方法 context_click(), 传入需要右击的元素 PyCharm, 最后
- perform() 方法为整个右击动作的提交
- '''
- driver.quit()
同样, 上面的 PyCharm 文件夹, 我们也可以双击鼠标来打开该文件, 双击操作如下:
ActionChains(driver).double_click(PyCharm).perform()
鼠标悬浮操作, 如将鼠标移动到网盘的账号处, 会显示该账号的信息, 如下图:
实现方法为 move_to_element() 如下:
- user = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span') # 定位到网盘账户位置
- ActionChains(driver).move_to_element(user).perform()
鼠标拖拽操作的没找到合适的网站, 使用方法大致如下:
- pesition1 = driver.find_element_by_xpath('//*[@id="layoutHeader"]') # 定位元素 A 的位置
- pesition2 = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span') # 定位元素 B 的位置
- ActionChains(driver).drag_and_drop(pesition1,pesition2).perform() # 进行拖拽操作
拖拽方法为 drag_and_drop(参数 1, 参数 2), 参数 1 为定位到的需要拖拽的元素, 参数 2 为定位到拖拽后的位置
3.2 模拟键盘操作
之前我们已经使用过键盘输入的方法 send_keys(), 但是如果我们需要操作更多的键如回车, 回格, ctrl,shift 以及各种组合键, 这时我们需要引入 webdriver 下面提供的 keys 类模块.
常用的键盘操作有: enter,backspace,ctrl+c,ctrl+v,F5 等, keys 模块都是有方法的
如模拟 backspace 键, 打开百度, 输入 Python3, 然后在 Backspace 去掉 3 这个数字, 再百度搜索:
- '''
- Code description:
- Create time:
- Developer:
- '''
- # -*- coding: utf-8 -*-
- from selenium import webdriver
- from selenium.webdriver.common.keys import Keys
- driver = webdriver.IE()
- driver.get('https://www.baidu.com/')
- baidu = driver.find_element_by_id('kw') # 定位到百度搜索框
- baidu.send_keys('Python3')
- baidu.send_keys(Keys.BACK_SPACE) # 使用 Keys.BACK_SPACE 来模拟 Backspace 键其它
其它操作键盘的方法就不列举了, 可以自己练习下, 在导入 Keys 模块后就可以调用模块下所有封装好的方法:
4 警告框处理
现在几乎很多软件都会嵌入各种警示框, 比如登陆验证出错会弹出警示框. 对于这些弹出的警示框, webdriver 也是提供了专门的方法, 来处理这类软件警示框.
Webdriver 通过 switch_to.alert() 方法来定位到警示框, 并提供了如下对警示框的操作方法:
获取警示框文本信息: text
点击确认: accapt()
取消确认: dismiss()
输入值, 如果警示框有提供输入框: send_keys()
比如如下一个登录页面, 当输入不对的账号或者密码时, 会弹出警示框
下面看看这些处理警示框的方法使用:
- username = driver.find_element_by_id('loginUserName')
- username.send_keys('123')
- password = driver.find_element_by_id('loginPassWord')
- password.send_keys('123')
- button_login = driver.find_element_by_id('loginBtn')
- button_login.click()
- alter = driver.switch_to_alert() # 获取警示框
- alter.text # 获取警示框文本信息
- alter.accept() # 确认警示框
- alter.dismiss() # 取消确认
- alter.send_keys() # 输入值, 如果警示框有输入框
注意 selenium 现在的方法为: switch_to.alert()
5 多窗口切换
有时我们需要打开多个浏览器窗口进行窗口切换, 操作不同窗口, 由于 selenium-webdrvier 只能在一个窗口中识别元素和对元素进行操作, 如果想要操作另外一个窗口, 就必须进行窗口切换. 对此, webdriver 也提供了这种多窗口切换的场景的实现方法. 由于每个打开的窗口句柄是不同的, 这样 webdriver 通过窗口句柄实现窗口切换. 具体方法如下:
current_window_handle 获取当前窗口句柄
window_handle 返回所有打开窗口的句柄, 返回的结果是一个列表
switch_to.Windows(handle) 切换到指定窗口, 参数 handle 为指定窗口的句柄
如下脚本以登录百度首页, 并打开另一个窗口进入到注册页面, 然后却换窗口到百度首页, 进行搜索为例说明以上方法使用:
- '''
- Code description:
- Create time:
- Developer:
- '''
- # -*- coding: utf-8 -*-
- from selenium import webdriver
- driver = webdriver.IE()
- driver.get('https://www.baidu.com/')
- driver.maximize_window()
- sreach_windows = driver.current_window_handle # 获取当前百度搜索窗口的句柄, 是一个字符串
- print(sreach_windows)
- driver.find_element_by_link_text(u'登录').click()
- driver.find_element_by_link_text(u'立即注册').click()
- all_handles = driver.window_handles # 得到搜索页面和注册页面所有的窗口句柄, 返回的是一个列表
- print(all_handles)
- # 进入到注册窗口
- for handle in all_handles:
- if handle != sreach_windows:
- driver.switch_to.Windows(handle) # 切换到指定窗口
- print("现在进入的是注册窗口")
- driver.find_element_by_name('userName').send_keys('123')
- # 切换到搜索窗口
- for handle in all_handles:
- if handle == sreach_windows:
- driver.switch_to.Windows(handle) # 切换到指定窗口
- print("现在进入的是搜索窗口")
- driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click() # 关闭注册窗口
- driver.find_element_by_id('kw').send_keys('python')
- driver.find_element_by_id('su').click()
6 设置等待时间
在测试过程中, 我们编写的脚本往往很快执行完成, 为了观察一些重要步骤的执行效果, 我们可以在脚本中添加执行等待时间或者我们需要定位的元素页面短时间没法加载出来时, 此时如果没有设置等待时间, 脚本执行就会出错: 元素不存在, 这时我们设置等待时间就非常有必要了. 对此, selenium-webdriver 提供了 Explicit Waits(显示等待) 和 Implicit Waits(隐性等待) 两种模式的等待时间设置, 另外 python 标准库模块 time 也提供了一种非智能的 sleep() 等待时间模式.
6.1 强制等待
Python 标准库模块 time 提供强制等待设置, 方法为 sleep(), 就是脚本执行过程中设置强制暂停脚本运行的时间间隔
6.2 隐性等待
设置隐性等待时间, 由 webdriver 提供. 隐性等待时间就是设置一个时间范围, 有个最大响应时间, 超时将会抛出异常. 如下脚本, 驱动打开 IE 浏览器, 我们设置了最大打开等待时间是 10s, 也就是说可能 2s 时 IE 就开启, 如果超过 10s 就会抛出异常. 使用方法为:
driver.implicitly_wait(10)
6.3 显示等待
设置显示等待时间, 由 webdriver 下的 WebDriverWait 模块提供. WebDriverWait() 会配合 until() 和 until_not() 方法一起使用, 根据判断条件而进行灵活进行处理时间等待问题, 他会不断的根据你设定的条件去判断, 直到超过你设置的等待时间, 如果设置的条件满足, 然后进行下一步操作, 如果没有满足会报一个'selenium.common.exceptions.TimeoutException: Message:'错误.
如下脚本设置用户名输入框显示等待时间, 并轮训判断该元素是否存在, 如果判断在设置时间内没有则抛出异常:, 如下使用方式:
来源: https://www.cnblogs.com/tdp0108/p/10469734.html