标签:el webdriver 04 Web selenium 自动化 driver time import
本篇博客
Selenium 高级
1 多表单切换-处理方法
2 鼠标和键盘操作
2.1 鼠标操作
2.1.1 鼠标操作-鼠标右击
2.1.2 鼠标操作-双击操作
2.1.3鼠标操作-鼠标悬停
2.2 键盘操作
3 弹出框操作
4 下拉框操作
5 调用js代码
6 浏览器等待
6.1 显示等待(用的少)
6.2 隐式等待(用的多)
7 cookies操作
8 API的简单封装
Selenium 高级
1 多表单切换-处理方法
跳回最外层的页面。
driver.switch_to.default_content()
跳回上层的页面。
driver.switch_to.parent_frame()
案例:本地加载,多表单切换
example_frame.html
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>frame</title> <script type="text/javascript" async="" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js "></script> <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" /> <script type="text/javascript"> $(document).ready(function(){ }); </script> </head> <body> <div class="row-fluid"> <div class="span10 well"> <h3>frame</h3> <iframe id="itcast_frame1" src="inner.html" width="800", height="600"></iframe> </div> </div> </body> <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script> </html>
inner.html
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>inner</title> </head> <body> <div class="row-fluid"> <div class="span6 well"> <h3>inner</h3> <iframe id="itcast_frame2" src="https://cn.bing.com/" width="700" height="500"></iframe> <a href="javascript:alert('watir-webdriver better than selenium webdriver;')">click</a> </div> </div> </body> </html>
主要步骤:
1. example_frame.html,inner.html,放在桌面的。
2. 从主文档切到frame2,一层层切进去
<html> <iframe id="frame1"> <iframe id="frame2" / > </iframe> </html>
driver.switch_to.frame("frame1") driver.switch_to.frame("frame2")
3.从frame2切回到主文档。
driver.switch_to.default_content()
#导包 from selenium import webdriver # 导入os库,用于获取文件路径 import os import time # 创建浏览器 driver = webdriver.Firefox() # 获取网页访问路径,os.path.abspath(文件名)获取文件的绝对路径 file_path = 'file:///' + os.path.abspath('example_frame.html') print(file_path) # 访问本地文件 driver.get(file_path) time.sleep(5) # 切换到第一个表单中 driver.switch_to.frame('itcast_frame1') # 切换到第二层表单 driver.switch_to.frame('itcast_frame2') # 定位到输入框 el = driver.find_element_by_id('sb_form_q') # 输入 el.send_keys('selenium') # 定位点击按钮 el_sub = driver.find_element_by_id('sb_form_go') el_sub.click() # 定位一个元素,验证已经到达深层表单 el_search = driver.find_element_by_id('sb_form') print('依然在最深层表单中') # 推到最外层,没有frame中(frame1,frame2) driver.switch_to.default_content() try: el_search = driver.find_element_by_id('sb_form') except: print('已经从表单中退出') # 打开(双击)桌面上文件ttt里的html文件 # file:///C:/Users/Administrator/Desktop/ttt/inner.html
2 鼠标和键盘操作
手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供
2.1 鼠标操作
导入动作链类,动作链可以储存鼠标的动作,并一起执行
from selenium.webdriver import ActionChains
ActionChains(driver)
执行ActionChains中储存的所有动作
perform()
2.1.1 鼠标操作-鼠标右击
el = driver.find_element_by_xxx(value) context_click(el)
对el执行右击
案例:百度首页
from selenium import webdriver # 导入动作链类 from selenium.webdriver import ActionChains import time # 开浏览器 driver = webdriver.Firefox() # 访问百度 url = 'http://www.baidu.com' driver.get(url) time.sleep(3) # 定位到logo元素 # 使用firebug查看元素-css el_logo = driver.find_element_by_css_selector('#lg>map>area') time.sleep(1) # 鼠标右击操作,操作元素前,需要将操作的元素定位出来并且穿入相应的动作中,如果要执行操作,需要调用perform() ActionChains(driver).context_click(el_logo).perform() time.sleep(3) driver.quit()
2.1.2 鼠标操作-双击操作
双击操作
el = driver.find_element_by_xxx(value) ActionChains(driver).double_click(el).perform()
案例:在头条双击
from selenium import webdriver # 导入动作链类 from selenium.webdriver import ActionChains import time # 开浏览器 driver = webdriver.Firefox() # 访问头条 url = 'https://www.toutiao.com/ch/news_society/' driver.get(url) time.sleep(3) # 定位到需要双击操作的元素 el = driver.find_element_by_css_selector('.wchannel > ul:nth-child(2) > li:nth-child(2) > a:nth-child(1) > span:nth-child(1)') # 双击定位到的元素,进行切换 ActionChains(driver).double_click(el).perform() time.sleep(5) driver.quit()
2.1.3 鼠标操作-鼠标悬停
鼠标悬停
el = driver.find_element_by_xxx(value) ActionChains(driver).move_to_element(el).perform()
案例:在京东悬停
from selenium import webdriver # 导入动作链类 from selenium.webdriver import ActionChains import time # 开一个浏览器 driver = webdriver.Firefox() driver.maximize_window() # 访问京东 url = 'http://www.jd.com' driver.get(url) # 获取分类组元素 el_list = driver.find_elements_by_class_name('cate_menu_item') for el in el_list: #移动鼠标 ActionChains(driver).move_to_element(el).perform() time.sleep(1) driver.quit()
2.2 键盘操作
键盘操作使用的是Keys类,一般配合send_keys使用
导入
from selenium.webdriver.common.key import Key
常用键盘操作
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
案例:必应搜索执行键盘操作
from selenium import webdriver # 导入Key类,key类中包含很多键盘按钮操作 from selenium.webdriver.common.keys import Keys import time # 打开浏览器 driver = webdriver.Firefox() # 访问必应搜索 url= 'http://cn.bing.com/' driver.get(url) # 定位到输入框 el = driver.find_element_by_id('sb_form_q') # 输入关键字 el.send_keys('selenium') time.sleep(2) el.send_keys(Keys.CONTROL,'a') time.sleep(2) # 执行剪切操作 el.send_keys(Keys.CONTROL,'x') time.sleep(2) # 执行粘贴操作 el.send_keys(Keys.CONTROL,'v') time.sleep(2) # 清空操作 el.clear() #输入 单词 el.send_keys('seleniumn') time.sleep(2) # 退格删除 el.send_keys(Keys.BACK_SPACE) time.sleep(5) driver.quit()
3 弹出框操作
弹出框操作
1) 进入到弹出框中
driver.switch_to.alert()
2) 接收警告
accept()
3) 解散警告
dismiss()
4) 发送文本到警告框
send_keys(data)
案例:百度设置
from selenium import webdriver import time # 创建一个浏览器 driver = webdriver.Firefox() # 访问百度 url = 'http://www.baidu.com' driver.get(url) time.sleep(2) # 定位到设置 el = driver.find_element_by_link_text('设置') el.click() time.sleep(2) # 定位搜索设置,并点击 el_set = driver.find_element_by_css_selector('.setpref') el_set.click() time.sleep(2) # 定位保存设置按钮 el_save = driver.find_element_by_css_selector('.prefpanelgo') el_save.click() time.sleep(2) # 进入警告框中,并且点击接受 driver.switch_to.alert.accept() # 进入警告框,并且解散警告框 # driver.switch_to.alert.dismiss() time.sleep(5) driver.quit()
4 下拉框操作(重要)
下拉框操作
selenium关于下拉框的操作都交由Select类进行处理,一般获取到下拉框元素之后使用该类构建对象,调用对象的响应方法就能操作元素
1) 导入Select类
from selenium.webdriver.support.select import Select
2) 将定位到的下拉框元素传入Select类中
selobj = Select(element) 下拉框元素已经定位到
3) 调用响应方法选择下拉框中的选项1
第一种:通过索引选择,index 索引从 0 开始
select_by_index() 通过索引选择,index 索引从 0 开始
第二种:通过值选择(option标签的一个属性值)
select_by_value() 通过值选择(option标签的一个属性值)
第三种:通过文本选择(下拉框的值)
select_by_visible_text()
4) 调用响应方法选择下拉框中的选项2
all_selected_options 查看所有已选 first_selected_option 查看第一个已选 is_multiple 查看是否是多选 options 查看选项元素列表
取消选择
deselect_by_index() deselect_by_value() deselect_by_visible_text()
案例:百度设置-下拉框
from selenium import webdriver # 导入Select类 from selenium.webdriver.support.select import Select import time # 创建一个浏览器 driver = webdriver.Firefox() # 访问百度 url = 'http://www.baidu.com' driver.get(url) # 定位到设置元素并且点击 el = driver.find_element_by_link_text('设置') el.click() # 定位搜索设置,并且点击 el_set = driver.find_element_by_css_selector('.setpref') el_set.click() # 定位到下拉框元素 el_select = driver.find_element_by_id('nr') # 创建下拉框对象 selobj = Select(el_select) # 通过选项的索引进行设置 # selobj.select_by_index(0) # time.sleep(1) # selobj.select_by_index(1) # time.sleep(1) # selobj.select_by_index(2) # 通过value进行设置 # selobj.select_by_value('50') # time.sleep(1) # selobj.select_by_value('20') # time.sleep(1) # selobj.select_by_value('10') # time.sleep(1) # 通过可见文本进行选择 selobj.select_by_visible_text('每页显示50条') time.sleep(1) selobj.select_by_visible_text('每页显示10条') time.sleep(1) selobj.select_by_visible_text('每页显示20条') time.sleep(1) # 打印对一个选择的选项 print(selobj.first_selected_option.text) time.sleep(3) driver.quit()
5 调用js代码
调用js代码
1) 什么是JS?
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言,用来给HTML网页增加动态功能。
JavaScript 是属于网络的脚本语言,被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。
2) 为什么要执行js代码?
因为selenium鞭长莫及,没有操作滚动条的方法,而一般操作滚动条都是使用js实现的。
3) selenium执行js
1.重要的js代码
第一种方法:
js1 = "window.scrollTo(x,y) "
x为水平拖动距离,y为垂直拖动举例
第二种方法:
js2= "var q=document.documentElement.scrollTop=n"
n为从顶部往下移动滚动举例
2.执行js代码
driver.execute_script(js)
案例:hao123持续下拉1
from selenium import webdriver import time # 创建浏览器 driver = webdriver.Firefox() # 访问好123 url = 'https://www.hao123.com/' driver.get(url) time.sleep(3) # 0 是水平位置 1000是垂直位置 js = 'window.scrollTo(0,1000)' driver.execute_script(js) time.sleep(3) js1= "var q=document.documentElement.scrollTop=0" driver.execute_script(js1) time.sleep(3) driver.quit()
案例:hao123持续下拉2(改良)
from selenium import webdriver import time # 创建浏览器 driver = webdriver.Firefox() # 访问好123 url = 'https://www.hao123.com/' driver.get(url) for i in range(100): # x管水平,y管垂直 # js = 'window.scrollTo(0,%s)'%(i*100) # driver.execute_script(js) # time.sleep(0.5) js1= "var q=document.documentElement.scrollTop=%s"%(i*100) driver.execute_script(js1) time.sleep(0.5) driver.quit()
6 浏览器等待
浏览器等待
1) 为什么要进行等待?
- 1.网速慢
- 2.网站内容过多
- 3.如果不进行等待而直接定位元素,可能会抛出异常
2) selenium中等待的分类:
- 显示等待
- 隐式等待
- 固定等待(以前学的,就加上了)
优先 隐式等待 次之显式等待 最次 固定等待
6.1 显示等待(用的少)
显示等待是根据条件进行等待,等待条件出现
导入:
from selenium.webdriver.common.by import By 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 提供的等待方法。下面是参数解释。
driver, 当前浏览器对象
timeout, 最大的等待时间。如果超过设置时间,检测不到则抛出异常。
poll_frequency=0.5, 在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在
ignored_exceptions=None 可以不写
案例:显示等待百度
from selenium import webdriver # 导入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 # 创建一个浏览器 driver = webdriver.Firefox() # 访问百度 url = 'http://www.baidu.com' driver.get(url) # 浏览器总共等待10秒,在10秒内,每隔0.5秒去使用id的方式定位一下元素,如果定位到,就结束等待,如果定位不到同时没有大于10秒,则继续等待 el = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,'lg'))) driver.close()
6.2 隐式等待(用的多)
隐式等待是根据是件进行等待,等待特定时间
driver.implicitly_wait(n)
n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待
案例:亚马逊
from selenium import webdriver # 创建浏览器 driver = webdriver.Firefox() url = 'https://www.amazon.cn/' driver.get(url) driver.implicitly_wait(20) driver.close()
7 cookies操作
cookies操作
1) 什么是cookies?
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行会话保持而储存在用户本地终端上的数据(通常经过加密)
2) 为什么要使用cookies?
1.因为http是无状态协议,他不对之前的的访问状态做管理,也就是说无法根据之前的登录状态进行本次访问的处理。
2.没有状态管理就不能保持登录状态,这样就会很麻烦。
3)cookies的使用原理
1.浏览器访问某个服务器上的web应用
2.服务器返回信息,让浏览器设置一些数据,这些数据服务器也会记录
3.浏览器接收到信息,进行设置
4.浏览器再次访问某个服务器上的web应用,这时候带上设置的cookie
5.服务器接收到信息,获取到cookie,进行比对,确认身份
6.后续正常共同
4)selenium对cookies的操作
get_cookies() 获取所有cookies get_cookie(key) 获取key对应的值 add_cookie(cookie_dict) 设置cookies delete_cookie(name) 删除指定名称的cookie delete_all_cookies() 删除所有cookie
案例:有道
from selenium import webdriver # 创建浏览器 driver = webdriver.Firefox() # 访问有道 url = 'http://www.youdao.com/' driver.get(url) # 获取cookies,直接调用,不需要参数 data = driver.get_cookies() print(data) # 删除所有cookies driver.delete_all_cookies() # 设置cookies cookie = {"name":"itcast","value":"soft_test"} driver.add_cookie(cookie) # 获取 data1 = driver.get_cookies() print(data1)
8 API的简单封装
学到这里,我们发现selenium的api有很多,我们如果全部记忆太过复杂,很多时候我们可以把常用的操作进行简单封装。
1.什么是函数封装?
函数封装是一种函数的功能,它把一个程序员写的一个或者多个功能通过函数、类的方式封装起来,对外只提供一个简单的函数接口。
2.对selenium的常用操作进行封装
1)封装开启关闭浏览器
2)封装定位操作
3)封装对元素的基本操作
案例:对Selenium基本操作封住
from selenium import webdriver import time class Common(object): # 初始化 def __init__(self): # 创建浏览器 self.driver = webdriver.Firefox() # 浏览器最大化 self.driver.maximize_window() # 访问指定url def open_url(self, url): self.driver.get(url) self.driver.implicitly_wait(10) def close_driver(self): self.driver.quit() # 结束的时候清理了 def __del__(self): time.sleep(3) self.driver.quit() if __name__ == '__main__': com = Common() com.open_url('http://www.baidu.com') com.open_url('http://www.hao123.com') com.close_driver()
标签:el,webdriver,04,Web,selenium,自动化,driver,time,import 来源: https://www.cnblogs.com/zhangyangcheng/p/12513771.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。