1.多标签/多窗口之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
2.多表单/多框架切换
在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
(1)什么是多表单?
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单链接可以使页面中开一个窗口显示另一个页面的内容
<iframe id="itcast_frame1" src="inner.html" width="800",
height="600"></iframe>
- 示例:
driver.switch_to.default_content()
跳回最外层的页面。
driver.switch_to.parent_frame()
跳回上层的页面。
# 导入os库,用于获取文件路径
import os
#os.path.abspath(文件名)获取文件的绝对路径
file_path = 'file:///' + os.path.abspath('example_frame.html')
# 定位一个元素,验证已经到达深层表单
el_search = driver.find_element_by_id('sb_form')
print('依然在最深层表单中')
#跳回最外层的页面
driver.switch_to.default_content()
try:
el_search = driver.find_element_by_id('sb_form')
except:
print('已经从表单中退出')
3. 鼠标和键盘操作
关于鼠标的操作由ActionChains类来提供,关于键盘的操作由Keys类来提供
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
- 鼠标操作
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
url = "http://cn.bing.com"
driver.get(url)
kw = driver.find_element_by_id("sb_form_q")
kw.send_keys("淘宝官网")
time.sleep(1)
#全选
kw.send_keys(Keys.CONTROL,'a')
time.sleep(1)
#剪切
kw.send_keys(Keys.CONTROL,'x')
time.sleep(1)
#复制
kw.send_keys(Keys.CONTROL,'v')
time.sleep(1)
driver.quit()
4. 弹出框操作
-
进入到弹出框中
driver.switch_to.alert() -
接收警告
accept() -
解散警告
dismiss() -
发送文本到警告框
send_keys(data)
#进入弹出框,并点击确定
driver.switch_to.alert().accept()
5.下拉框操作
-
导入Select类
from selenium.webdriver.support.select import Select
-
将定位到的下拉框元素传入Select类中
selobj = Select(element)
#下拉框元素已经定位到 -
调用响应方法选择下拉框中的选项
select_by_index()
通过索引选择,index 索引从 0 开始select_by_value()
通过值选择(option标签的value属性的值)select_by_visible_text()
通过文本选择(下拉框的文本内容) -
取消选择
deselect_by_index()
deselect_by_value()
deselect_by_visible_text() -
其他
all_selected_options #查看所有已选
first_selected_option #查看第一个已选
is_multiple #查看是否是多选
options #查看选项元素列表
6.调用js代码
为什么要执行js代码?
因为selenium鞭长莫及,没有操作滚动条的方法,而一般操作滚动条都是使用js实现的。
#x为水平拖动距离,y为垂直拖动距离
js = 'window.scrollTo(x,y) '
#执行js代码
driver.execute_script(js)
n为从顶部往下移动滚动距离
js= 'var q=document.documentElement.scrollTop=n'
driver.execute_script(js)
7.浏览器等待
-
为什么要进行等待?
1.网速慢
2.网站内容过多
3.如果不进行等待而直接定位元素,可能会抛出异常 -
selenium中等待的分类:
-
显示等待:显示等待是根据条件进行等待,等待条件出现
-
隐式等待: 隐式等待是根据时间进行等待,等待特定时间
driver.implicitly_wait(n)
n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待优先使用 隐式等待 --> 显式等待–> 固定等待(time.sleep())