Selenium API高级
多标签之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
获取所有窗口的句柄
handles = driver. window_handles
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通过窗口句柄激活进入某一窗口
案例: 58同城租房信息:http://bj.58.com
多表单切换
在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
什么是多表单?
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
处理方法
直接使用id值切换进表单
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)
案例: QQ空间:https://qzone.qq.com/
126网站登录:https://www.126.com/ (需要谷歌的操作)
弹出框操作
进入到弹出框中
driver.switch_to.alert
接收警告
accept()
解散警告
dismiss()
发送文本到警告框
send_keys(data)
滚动条操作
js = ‘window.scrollTo(0,b)‘ #b表示距离定位的距离
driver.execute_script(js) #执行js脚本
滚动条回到顶部
js = "window.scrollTo(0,0)"或者 js=“var q=document.documentElement.scrollTop=0“
滚动条回到底部
js = “window.scrollTo(0,document.body.scrollHeight)”
js="var q=document.documentElement.scrollTop=10000“
滚动条拉到指定位置(具体元素):--最常用
target = driver.find_element_by_id(“id_keypair”) #定位移动到的元素 driver.execute_script("arguments[0].scrollIntoView();", target)
鼠标和键盘操作
手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供
鼠标操作
导入动作链类,动作链可以储存鼠标的动作
from selenium.webdriver import ActionChains
获取元素
el = driver.find_element_by_xxx(value)
context_click(el) 对el执行右击
执行ActionChains中储存的所有动作
perform()
例子
ActionChains(driver).context_click(ele).perform() 点击鼠标右键 ActionChains(driver). click(ele).perform() 点击鼠标左键 ActionChains(driver).move_to_element(el).perform() 鼠标悬停
键盘操作
键盘操作使用的是Keys类,一般配合send_keys使用
导入
from selenium.webdriver.common.keys import Keys
常用键盘操作
send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
浏览器等待
为什么要进行等待?
网速慢
网站内容过多
如果不进行等待而直接定位元素,可能会抛出异常
内容加载慢
selenium中等待的分类
强制等待
显示等待
隐式等待