WebDriver
Posted mia0812
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebDriver相关的知识,希望对你有一定的参考价值。
一.WebDriver操作浏览器常用方法
1.maximize_window() 最大化
模拟浏览器最大化按钮
2.set_window_size(宽,高) 浏览器大小
设置浏览器宽、高(像素点)
3.set_window_position(x轴,y轴) 浏览器位置
设置浏览器位置
- 1,2,3的代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 # 操作浏览器与具体打开的页面无关,因此可以不用打开页面 5 6 # 1.浏览器最大化:maximize_window() 7 driver.maximize_window() 8 # 获取窗口大小 9 size = driver.get_window_size() 10 print("window size:",size) 11 sleep(2) 12 # 2.设置浏览器大小:set_window_size(宽,高) 13 driver.set_window_size(600,300) 14 # 获取窗口大小 15 size2 = driver.get_window_size() 16 print("window size:",size2) 17 sleep(2) 18 # 3.设置浏览器位置:set_window_position(x轴,y轴) 19 driver.set_window_position(300,200) 20 # 获取浏览器位置 21 position = driver.get_window_position() 22 print("window position:",position) 23 sleep(2) 24 25 driver.quit()
- 结果:
4.forward() 前进
模拟浏览器前进按钮
5.back() 后退
模拟浏览器后退按钮
- 注意:back()和forward()是在同一窗口中打开的多个页面进行回退和前进
- 4,5的代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 list = ["url","https://www.baidu.com"] 5 for url in list: 6 driver.get(url) 7 # 获取当前页面url 8 print("当前页面url:",driver.current_url) 9 sleep(10) 10 for i in range(2): 11 driver.back() 12 sleep(5) 13 for i in range(2): 14 driver.forward() 15 # 获取当前页面url 16 print("当前页面url:", driver.current_url) 17 sleep(5) 18 driver.quit()
- 结果:
6.refresh() 刷新
模拟浏览器F5刷新
7.close() 关闭
模拟浏览器关闭按钮(关闭单个窗口)
- close():关闭当前操作焦点对应的窗口
8.quit() 关闭
关闭所有WebDriver启动的窗口
二.WebDriver其他常用方法
1.size 返回元素大小
2.text 获取元素的文本
3.title 获取页面title
4.current_url 获取当前页面URL
5.get_attribute("xxx") 获取属性值
- xxx:要获取的属性
6.is_display() 判断元素是否可见
7.is_enabled() 判断元素是否可用
- 注意:
- 1.size、text、title、current_url:为属性,调用时无括号,如:xxx.size
- title、current_url:使用浏览器实例化对象直接使用,如:driver.title
- 上述方法的代码如下:
1 from selenium import webdriver 2 driver = webdriver.Chrome() 3 driver.get("url") 4 # 1.size 获取userA元素的大小 5 print("userA元素的大小:",driver.find_element_by_id("userA").size) 6 # 2.text 获取 访问 新浪 网站 元素的文本 7 print("访问 新浪 网站 的文本:",driver.find_element_by_id("fwA").text) 8 # 3.title 获取标题 9 print("标题是:",driver.title) 10 # 4.current_url 获取当前url 11 print("当前url:",driver.current_url) 12 # 5.get_attribute(属性名) 获取元素属性值 13 print("userA id属性值",driver.find_element_by_name("userA").get_attribute("id")) 14 # 6.is_display() 判断元素是否显示 15 print("span元素是否显示:",driver.find_element_by_tag_name("span").is_displayed()) 16 # 7.is_enabled() 判断元素是否可用 17 print("cancledA元素是否可用:",driver.find_element_by_id("cancelA").is_enabled()) 18 driver.quit()
- 结果:
三.WebDriver鼠标操作
- 在WebDriver中将操作鼠标的方法封装在ActionChains类中
- 代码实现关键点分析
- 1.导包:from selenium.webdriver.common.action_chains import ActionChains
- 2.实例化ActionChains对象:action=ActionChains(driver)
- 3.调用具体鼠标操作方法,例:action.context_click(所定位的元素)
- 4.执行:element.perform()
1.perform() 执行
此方法用来执行以下所有鼠标方法
- 说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有行为都存储在ActionChains类中,而perform()方法就是执行所有ActionChains中的行为
- 必须调用perform()方法才能执行鼠标事件
2.context_click() 右击
此方法模拟鼠标右键点击效果
3.double_click() 双击
此方法模拟鼠标双击效果
- 1,2,3,5方法代码如下:
1 from selenium import webdriver 2 from selenium.webdriver.common.action_chains import ActionChains 3 from time import sleep 4 driver = webdriver.Chrome() 5 driver.get("url") 6 action = ActionChains(driver) 7 userA_ele = driver.find_element_by_id("userA") 8 # 2.context_click() 鼠标右击 9 action.context_click(userA_ele).perform() 10 sleep(2) 11 # 3.double_click() 鼠标双击 12 userA_ele.send_keys("admin") 13 action.double_click() 14 # 1.action.perform() 鼠标执行 15 action.perform() 16 sleep(2) 17 # 5.move_to_element() 悬停 18 but_ele = driver.find_element_by_css_selector("#zc>fieldset>button") 19 action.move_to_element(but_ele).perform() 20 sleep(2) 21 driver.quit()
4.drag_and_drop(开始元素,结束元素) 拖动
此方法模拟鼠标拖动效果
- 代码如下:
1 from selenium.webdriver.common.action_chains import ActionChains 2 from selenium import webdriver 3 from time import sleep 4 driver = webdriver.Chrome() 5 driver.get("url") 6 action = ActionChains(driver) 7 str_ele = driver.find_element_by_id("div1") 8 tag_ele = driver.find_element_by_id("div2") 9 # 4.action.drag_and_drop() 鼠标拖拽 10 action.drag_and_drop(str_ele,tag_ele).perform() 11 sleep(2) 12 driver.quit()
5.move_to_element() 悬停
此方法模拟鼠标悬停效果
四.WebDriver键盘操作
- 模拟键盘上一些按键或者组合键的输入,如:Ctrl+C、Ctrl+V;
- WebDriver中对键盘的操作都封装在Keys类中
1.send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
2.send_keys(Keys.SPACE) 空格键(Space)
3.send_keys(Keys.TAB) 制表键(Tab)
4.send_keys(Keys.ESCAPE) 回退键(Esc)
5.send_keys(Keys.ENTER) 回车键(Enter)
6.send_keys(Keys.CONTROL,\'a\') 全选(Ctrl+A)
7.send_keys(Keys.CONTROL,\'c\') 复制(Ctrl+C)
- 1,2,6,7代码如下:
1 from selenium import webdriver 2 from selenium.webdriver.common.keys import Keys 3 from time import sleep 4 driver = webdriver.Chrome() 5 driver.get("url") 6 userA_el = driver.find_element_by_id("userA") 7 telA_el = driver.find_element_by_id("telA") 8 userA_el.send_keys("admin1") 9 sleep(2) 10 # 1.删除末尾的1 11 userA_el.send_keys(Keys.BACK_SPACE) 12 sleep(2) 13 # 6.全选admin 14 userA_el.send_keys(Keys.CONTROL,\'a\') 15 sleep(2) 16 # 7.复制admin 17 userA_el.send_keys(Keys.CONTROL,\'c\') 18 sleep(2) 19 # 2.给telA先添加空格键 20 telA_el.send_keys(Keys.SPACE) 21 sleep(2) 22 # 粘贴admin到telA 23 telA_el.send_keys(Keys.CONTROL,\'v\') 24 sleep(2) 25 driver.quit()
五.WebDriver显示等待和隐式等待
1. 元素等待
- 什么是元素等待:WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程;
- 为什么要设置元素等待?
由于网络速度原因
电脑配置原因
服务器处理请求原因
- 元素等待类型:显式等待、隐式等待
2.显示等待
- 显示等待:使WebDriver等待指定元素条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
- 提示:
在WebDriver中把显式等待的相关方法封装在WebDriverWait类中
等待是判定条件成立时,那如何判断条件成立?相关判断的方法封装在expected_conditions类中
- 代码如下:
1 from selenium import webdriver 2 from selenium.webdriver.support.wait import WebDriverWait 3 import time 4 from selenium.webdriver.common.by import By 5 from selenium.webdriver.support import expected_conditions as EC 6 driver = webdriver.Chrome() 7 driver.get("url") 8 # 设置显示等待 9 # 1.创建WebDriverWait对象 10 wait_obj = WebDriverWait(driver,5,poll_frequency=0.5) #在5秒内出现时不会再等待到5秒 11 # 2.设置等待条件-等待谁出现 12 f = lambda x : x.find_element_by_id("userA") #x最终会被driver代替 13 try: 14 print("start time:",time.strftime("%H:%M:%S")) 15 userA = wait_obj.until(f) #放在until中的是自定义的函数 16 except: 17 print("end time",time.strftime("%H:%M:%S")) 18 print("等待5秒,条件未发生") 19 else: 20 userA.send_keys("admin") 21 # 显示等待的另一种表达方式 放在until中的是WebDriverWait提供的内容完成条件设置 22 WebDriverWait(driver,5,poll_frequency=0.5).until(EC.presence_of_element_located((By.ID,\'telA\'))).send_keys("18812345678") 23 time.sleep(2) 24 driver.quit()
3.隐式等待 implicitly_wait
- 代码如下:
1 from selenium import webdriver 2 from selenium.common.exceptions import NoSuchElementException 3 import time 4 driver = webdriver.Chrome() 5 driver.get("url") 6 # 隐式等待 7 driver.implicitly_wait(5) 8 try: 9 print("start time:",time.strftime("%H:%M:%S")) 10 el = driver.find_element_by_id("userA") 11 except NoSuchElementException as n: 12 print("end time:",time.strftime("%H:%M:%S")) 13 print("元素没有出现",n) 14 else: 15 el.send_keys("admin") 16 driver.quit()
六.WebDriver下拉选择框 select
- select类是WebDriver为解决select标签定位诞生的,此类定位的是select标签
- select方法:
- select_by_index():根据option索引来定位,从0开始
- select_by_value():根据option属性 value值来定位
- select_by_visible_text():根据option显示文本来定位
- 代码如下:
1 from selenium import webdriver 2 from selenium.webdriver.support.select import Select 3 import time 4 driver = webdriver.Chrome() 5 driver.get("url") 6 select_el = driver.find_element_by_tag_name("select") 7 # 实例化Select类,传的参数为定位到的select标签 8 sel = Select(select_el) 9 # select方法1 index从0开始 10 sel.select_by_index(1) 11 time.sleep(3) 12 # select方法2 value后面是选项的value值 13 sel.select_by_value("gz") 14 time.sleep(4) 15 # select方法3 16 sel.select_by_visible_text("A重庆") 17 time.sleep(5) 18 driver.quit()
七.WebDriver警告框(操作时要先切换到弹出框)
- WebDriver中对处理警告框的操作,有专用的处理方法
- html中常见的对话框有三种,处理的方法都一样:alert、confirm、prompt
- 处理方法:
- text:返回alert、confirm、prompt中的文字信息
- accept():接受对话框选项 -->相当于点击确定
- dismiss():取消对话框选项 -->相当于点击x号
- 注意事项:
- 出现弹出框后,关闭弹出框前,不能操作页面中的内容
- 不能通过find_element_by_xxx()定位弹出框的元素
- 代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 driver.get("url") 5 driver.find_element_by_id("alerta").click() 6 # 切换到弹出框 7 alert_el = driver.switch_to.alert 8 # 返回alert的文本信息 9 print("弹出框的操作为:",alert_el.text) 10 sleep(2) 11 # 接受对话框选项 -->相当于点击确定 12 alert_el.accept() 13 # 取消对话选项 14 # alert_el.dismiss() 15 sleep(2) 16 driver.quit()
八.WebDriver滚动条操作
- WebDriver类库中并没有直接提供对滚动条进行操作方法,但是它提供了可调用javascript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的;
- 滚动条:一种可控制程序页面显示范围的组件
- JavaScript:一种流行脚本语言,可以操作HTML标签;
- JavaScript学习资料:http://www.w3school.com.cn/js/js_intro.asp
代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 driver.get("url") 5 sleep(2) 6 # 设置JavaScript脚本控制滚动条 7 js = "window.scrollTo(0,1000)" #0:左边距;1000:上边距;单位像素 8 # WebDriver调用js脚本方法 9 driver.execute_script(js) 10 sleep(3) 11 driver.quit()
九.WebDriver-frame表单切换
-
frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素(HTML语言中,frame/iframe标签为表单框架)
- 代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 driver.maximize_window() 5 driver.get("url") 6 # 进行frame表单切换--第一种:参数为iframe标签的id属性 7 # driver.switch_to.frame("idframe1") 8 # 进行frame表单切换--第二种:参数为iframe标签的name属性 9 driver.switch_to.frame("myframe1") 10 # 进行frame表单切换--第三种:参数为定位好的iframe标签元素对象 11 # driver.switch_to.frame(driver.find_element_by_id("idframe1")) 12 driver.find_element_by_id("userA").send_keys("adminA") 13 sleep(2) 14 # 切换回主页面,输入admin 15 # driver.switch_to.default_content() #跳回至最外层的页面 16 driver.switch_to.parent_frame() #跳回至上一层页面 17 driver.find_element_by_id("user").send_keys("admin") 18 sleep(3) 19 # 切换至frameB表单 20 driver.switch_to.frame("myframe2") 21 driver.find_element_by_id("userB").send_keys("adminB") 22 sleep(3) 23 driver.quit()
十.WebDriver多窗口切换
-
说明:在HTML页面中,经常有a标签也就是超链接,这些链接在被执行时,有的会在新的窗口打开链接;
-
说明:在WebDriver中封装了获取当前窗口句柄方法和获取所有窗口句柄的方法以及切换指定句柄窗口的方法;(句柄:英文handle,窗口的唯一识别码)
- 方法:
- driver.current_window_handle -->获取当前窗口句柄
- driver.window_handles -->获取所有窗口句柄
- driver.switch_to.window(handle) -->切换指定句柄窗口
- 代码如下:
1 from selenium import webdriver 2 from time import sleep 3 driver = webdriver.Chrome() 4 driver.get("url") 5 # 打印window_handles长度 6 print("len_window_handles:",len(driver.window_handles)) 7 # 打印window_handles内容 8 print("windon_handles:",driver.window_handles) 9 # 点击注册A链接打开新窗口 10 driver.find_element_by_id("ZCA").click() 11 print("first click,len_window_handles:",len(driver.window_handles)) 12 print("first click,windon_handles:",driver.window_handles) 13 # 点击注册B链接打开新窗口 14 driver.find_element_by_id("ZCB").click() 15 print("second click,len_window_handles:",len(driver.window_handles)) 16 print("second click,windon_handles:",driver.window_handles) 17 # 切换前的window_handle 18 print("切换前,window_handle:",driver.current_window_handle) 19 # 切换至注册A窗口,新窗口是第二个窗口 20 driver.switch_to.window(driver.window_handles[1]) 21 print("first click,window_handle:",driver.current_window_handle) 22 # 在注册A窗口输入内容 23 driver.find_element_by_id("userA").send_keys("adminA") 24 sleep(2) 25 # 切换至注册B窗口,新窗口是第三个窗口 26 driver.switch_to.window(driver.window_handles[2]) 27 print("second click,window_handle:",driver.current_window_handle) 28 # 在注册B窗口输入内容 29 driver.find_element_by_id("userB").send_keys("adminB") 30 sleep(2) 31 # 切换回主页面并输入内容 32 driver.switch_to.window(driver.window_handles[0]) 33 driver.find_element_by_id("user").send_keys("admin") 34 sleep(2) 35 print("last_len_window_handles:",len(driver.window_handles)) 36 print("last_windon_handles:",driver.window_handles) 37 print("last_window_handle:",driver.current_window_handle) 38 driver.quit()
十一.WebDriver窗口截图
-
说明:自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候对当前
窗口截图保存,那么通过图片就可以非常直观地看到出错的原因。
- 方法:
- get_screenshot_as_file(imgpath) -->截取当前窗口(imgpath:图片保存路径)
- 代码如下:
1 from selenium import webdriver 2 import time 3 driver = webdriver.Chrome() 4 driver.get("D:///软件测试-传智播客/1-课堂视频/9、web自动化测试/day01/02-其他资源/注册页面-素材/注册A.html") 5 driver.get_screenshot_as_file("./注册A_%s.png" % time.strftime("%H_%M_%S")) 基于 webdriver 的测试代码日常调试方python 篇