Selenium API高级
<p><strong>1.多标签切换</strong></p>
<pre><code>场景:
有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
1)获取所有窗口的句柄
handles = driver.window_handlers()
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
2)通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])</code></pre>
<p><strong>2.多表单切换</strong></p>
<pre><code>场景:
在网页中,表单嵌套是很常见的情况,尤其是在登录的场景中
概念:
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面;
处理方法:
1)直接使用id值切换进表单
driver.switch_to.frame(value)/driver.switch_to_frame(value)
2)定位到表单元素,再切换进入frame界面
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)
3)再切换退出frame界面,跳回最外层的页面
driver.switch_to.default_content()
4)再切换退出frame界面,跳回上层的页面-父层
driver.switch_to.parent_frame()
案例:
加载实现的frame表单文件,并操作里面的百度</code></pre>
<p><strong>3.鼠标和键盘操作</strong></p>
<p>3.1概念</p>
<pre><code>手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供;</code></pre>
<p>3.2鼠标操作</p>
<pre><code>3.2.1导入动作链类,动作链可以储存鼠标的动作,并一起执行
from selenium.webdriver import ActionChains
ActionChains(driver)
3.2.2执行ActionChains中储存的所有动作
perform()
3.2.3鼠标右击
#定位元素
el = driver.find_element_by_xxx(value)
#操作元素前,需要将操作的元素定位出来并且传入相应的动作中,就是把浏览器放进去
ActionChains(driver)
#对el执行右击
context_click(el)
#执行右击这个动作
perform()
即:
ActionChains(driver).context_click(el).perform()
案例:
百度首页
3.2.4双击操作
el = driver.find_element_by_xxx(value)
ActionChains(driver).double_click(el).perform()
3.2.5鼠标悬停
el = driver.find_element_by_xxx(value)
ActionChains(driver).move_to_element(el).perform()
案例:
1.在头条双击
2.在京东悬停</code></pre>
<p>3.3键盘操作</p>
<pre><code>3.3.1 键盘操作使用的是Keys类,一般配合send_keys使用
3.3.2 导入:
from selenium.webdriver.common.key import Key
3.3.3 常用键盘操作:
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)
send_keys(Keys.CONTROL,‘c’) //复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) //剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) //粘贴(Ctrl+V)
send_keys(Keys.F1) //键盘 F1
send_keys(Keys.F12) //键盘 F12
xxx.clear() //清空操作
案例:
必应搜索执行键盘操作</code></pre>
<p><strong>4.弹出框操作</strong></p>
<pre><code>1) 进入到弹出框中
driver.switch_to.alert()
2) 接收警告
accept()
3) 解散警告;进入警告框,并且解散警告框(右上角的X号)
dismiss()
4) 发送文本到警告框
send_keys(data)
案例:
百度设置</code></pre>
<p><strong>5.下拉框操作</strong></p>
<pre><code>5.1 selenium关于下拉框的操作都交由Select类进行处理,一般获取到下拉框元素之后使用该类构建对象,调用对象的响应方法就能操作元素
1) 导入Select类
from selenium.webdriver.support.select import Select
2) 将定位到的下拉框元素传入Select类中
selobj = Select(element) 下拉框元素已经定位到
3) 调用响应方法选择下拉框中的选项
select_by_index() 通过索引选择(index索引从0开始)
select_by_value() 通过值选择(option标签的一个属性值)
select_by_visible_text() 通过文本选择(下拉框的值)
all_selected_options 查看所有已选
first_selected_option 查看第一个已选
is_multiple 查看是否是多选
options 查看选项元素列表
5.2取消选择:
deselect_by_index()
deselect_by_value()
deselect_by_visible_text()</code></pre>
<p><strong>6.调用js代码(滚动条操作)</strong></p>
<pre><code>6.1 概念:
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言,用来给HTML网页增加动态功能。
JavaScript 是属于网络的脚本语言,被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。
6.2 目的:
因为selenium鞭长莫及,没有操作滚动条的方法,而一般操作滚动条都是使用js实现的。
6.3 重要的js代码:
js = "window.scrollTo(x,y) " //x为水平拖动距离,y为垂直拖动距离;scroll滚动;
js= "var q=document.documentElement.scrollTop=n" //n为从顶部往下移动滚动举例;n上下滚动
driver.execute_script(js) //执行js代码
案例:
hao123持续下拉</code></pre>
<p><strong>7.浏览器等待</strong></p>
<pre><code>7.1说明
1) 为什么要进行等待?
1.网速慢
2.网站内容过多
3.如果不进行等待而直接定位元素,可能会抛出异常
2) selenium中等待的分类&优先顺序:
显示等待(次之)
隐式等待(优先)
固定等待(最次)</code></pre>
<p>7.2显示等待</p>
<pre><code>实现:
#By类
from selenium.webdriver.common.by import By
#webdriver等待类
from selenium.webdriver.support.ui import WebDriverWait
#预期条件设置类
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait类是由WebDirver 提供的等待方法。
在设置时间内,显示等待是根据条件进行等待,等待条件出现;默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。
el = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,'lg')))
案例:
显示等待百度</code></pre>
<p>7.3隐式等待</p>
<pre><code>隐式等待是根据条件进行等待特定的时间;n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待;超过最大值没有定位到就会报错;
driver.implicitly_wait(n)
案例:亚马逊</code></pre>
<p>7.4固定等待</p>
<pre><code>time.sleep(1)
sleep(1)</code></pre>
<p><strong>8.cookies操作</strong></p>
<pre><code>8.1 概念
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行会话保持而储存在用户本地终端上的数据(通常经过加密)
8.2 目的
1.因为http是无状态协议,他不对之前的的访问状态做管理,也就是说无法根据之前的登录状态进行本次访问的处理。
2.没有状态管理就不能保持登录状态,这样就会很麻烦。
8.3 原理
1.浏览器访问某个服务器上的web应用
2.服务器返回信息,让浏览器设置一些数据,这些数据服务器也会记录
3.浏览器接收到信息,进行设置
4.浏览器再次访问某个服务器上的web应用,这时候带上设置的cookie
5.服务器接收到信息,获取到cookie,进行比对,确认身份
6.后续正常共同</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f4d93f9b60b6eb4795226d5cde8a4211?showdoc=.jpg" alt="" />
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9714643459efe49e2d0c4388b24327ae?showdoc=.jpg" alt="" /></p>
<pre><code>8.4selenium对cookies的操作
get_cookies() //获取所有cookies,直接调用不需要参数
get_cookie(key) //获取key对应的值
add_cookie(cookie_dict) //设置cookies
delete_cookie(name) //删除指定名称的cookie
delete_all_cookies() //删除所有cookie
案例: 有道</code></pre>
<p><strong>9.Selenium API的简单封装</strong></p>
<pre><code>9.1 函数封装概念
函数封装是一种函数的功能,它把一个程序员写的一个或者多个功能通过函数、类的方式封装起来,对外只提供一个简单的函数接口。
9.2 对selenium的常用操作进行封装
1)封装开启关闭浏览器
2)封装定位操作
3)封装对元素的基本操作</code></pre>