当前位置:   article > 正文

【软件测试】selenium与webdriver详解_selenium-webdriver

selenium-webdriver

什么是selenium

Selenium是ThoughtWorks公司一个强大的开源Web功能测试工具系列,支持多平台、多浏览器、多语言去实现 自动化测试

webdriver的工作原理
启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver 的remote server。
客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium 我们希望浏览器接下来做什么事情)。
Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
1.基本配置:安装火狐浏览器,工具–选项–高级–停止更新,版本为54位的(56 装3.6的IDE)
2.安装IDE附件:工具–附加组件–扩展—搜索selenium IDE,Firebug, FireBug,安装插件

selenium IDE使用

1.进入火狐浏览器–工具–selenium IDE,进入自动化测试脚本录制界面(有小红点显示默认录制开始)
2.在浏览器中操作,操作完成,回到录制界面,停止录制
3.运行全部case/运行当前case

导出录制脚本:
文件–Export Test Case As–选择语言

录制代码表达式:
open:打开一个网站
type:根据html中的标签和属性,值定位操作
click:点击操作

录制脚本生成的代码冗余代码多,后期建议手写代码;
一个简单的python脚本

#coding = utf-8//设置字符集
from selenium import webdriver//导入一个方法包
import time
browser =  webdriver.Firefox() 
time.sleep(3) 
browser.get("http://www.baidu.com") //打开浏览器
time.sleep(3) 
browser.find_element_by_id("kw").send_keys("selenium") //通过find_element_by_id方法定位在浏览器的位置
time.sleep(3) 
browser.find_element_by_id("su").click() //定位位置并点击
browser.quit()//browser.close()表示关闭当前窗口。
//quit表示退出并关闭窗口的每一个相关的驱动程序。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

webdriver常用的API

对象的定位

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象,webdriver 提供了一系列的对象定位方法,不论使用任何方式,属性值一定得是唯一的才能定位成功,常用的有以下八种

  • id :find_element_by_id("xx").send_keys("xx")
  • name :browser.find_element_by_name("wd").send_keys("selenium")
  • class name :browser.find_element_by_class_name("s_ipt").send_keys("selenium")
  • link text(文字链接的操作) :browser.find_element_by_link_text("hao123").click()
  • partial link text ():browser.find_element_by_partial_link_text("hao").click()
  • tag name :browser.find_element_by_tag_name("input").send_keys("selenium") //若有多个相同的标签名则不成功,
  • xpath :browser.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
  • css selector:browser.find_element_by_css_selector("#kw").send_keys("selenium")

谷歌浏览器 中,可在调试台中,定位到指定位置–右键–copy–copy selector(css)/copy xpath(xpath)

在python中,不能双引号叠加

webdriver操作对象的 方法

webdriver 中比较常用的操作对象的方法有下面几个:

  • click 点击对象 :browser.find_element_by_id("su").click()
  • send_keys 在对象上模拟按键输入 :driver.find_element_by_id("kw").send_keys("test")
  • clear 清除对象的内容(针对文本框中内容的清除),如果可以的话 :driver.find_element_by_id("kw").clear()
  • submit 清除对象的内容(针对于输入框则清除内容,针对于按钮则提交),如果可以的话 :driver.find_element_by_id("su").submit()
  • text 用于获取元素的文本信息 :data=driver.find_element_by_id("cp").text print data #打印信息
  • sleep等待(需要导入time包):import time time.sleep(3)
  • 智能等待:browser.implicitly_wait(30)
  • 打印title:print driver.title
  • 打印url:print driver.current_url #打印url
  • 将浏览器最大化显示:browser.maximize_window()
  • 设置浏览器宽和高:browser.set_window_size(480, 800)
  • 浏览器的后退:browser.back()
  • 浏览器的前进:browser.forward()
  • 将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000" 
driver.execute_script(js) 
  • 1
  • 2
  • 将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0" 
driver.execute_script(js) 
  • 1
  • 2

键盘事件

要想调用键盘按键操作需要引入keys 包:

from selenium.webdriver.common.keys import Keys 
  • 1

通过send_keys()调用按键:
清除信息
#tab 的定位相当于清除了密码框的默认提示信息,等同于clear() driver.find_element_by_id("account").send_keys(Keys.TAB)

tab 的定位相当于清除了密码框的默认提示信息,等同上面的clear()

driver.find_element_by_id("account").send_keys(Keys.TAB) 
  • 1

提交信息:可定位登陆按钮,通过enter(回车)代替click() :

driver.find_element_by_id("login").send_keys(Keys.ENTER) 
  • 1

ctrl+a 全选输入框内容

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') 
  • 1

ctrl+x 剪切输入框内容

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') 
  • 1

鼠标点击事件:

使用鼠标事件,需引进相应的模块

from selenium.webdriver.common.action_chains import ActionChains 
  • 1

生成用户的行为:ActionChains(driver)所有的行动都存储在actionchains 对象。通过perform()存储的行为。
右击操作:ActionChains(driver).context_click(qqq).perform()
双击操作:ActionChains(driver).double_click(qqq).perform()
拖动操作:

  • 定位元素的原位置 element = driver.find_element_by_id("s_btn_wr")
  • 定位元素要移动到的目标位置 target = driver.find_element_by_class_name("btn")
  • 执行元素的移动操作 ActionChains(driver).drag_and_drop(element, target).perform()

移动鼠标到一个元素中:move_to_element(menu)

定位一组元素

定位一组对象,使用findElements 方法
在html页面中勾选复选框操作:
1.获取html源文件file_path = 'file:///' + os.path.abspath('checkbox.html') dr.get(file_path)
2.定位到input标签:inputs = dr.find_elements_by_tag_name('input')
3.for循环获取所有复选框内容:

for input in inputs:    
if input.get_attribute('type') == 'checkbox':       
input.click() 
  • 1
  • 2
  • 3

多层框架/窗口定位

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中, seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题
对于两层嵌套的frame框架:
先找到到ifrome1(id = f1) browser.switch_to_frame("f1")
再找到其下面的ifrome2(id =f2) browser.switch_to_frame("f2")
下面就可以正常的操作元素了

层级定位

先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul 下的某个具体的link。 在这里,我们定位第1个下拉菜单中的Action 这个选项

#coding=utf-8 
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 
import time 
import os 
dr = webdriver.Chrome() 
file_path = 'file:///' + os.path.abspath('level_locate.html') 
dr.get(file_path) 

dr.find_element_by_link_text('Link1').click() #点击Link1链接(弹出下拉列表) 

WebDriverWait(dr,10).until(lambda the_driver: 

the_driver.find_element_by_id('dropdown1').is_displayed()) #找到id 为dropdown1的父元素 

menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action') #在父亲元件下找到link 为Action 的子元素 

webdriver.ActionChains(dr).move_to_element(menu).perform() #鼠标定位到子元素上
time.sleep(2) 
dr.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

下拉框处理

#coding=utf-8 
from selenium 
import webdriver 
import os,time 
driver= webdriver.Chrome() 
file_path = 'file:///' + os.path.abspath('drop_down.html') 
driver.get(file_path) time.sleep(2) 
#先定位到下拉框 
m=driver.find_element_by_id("ShippingMethod") 
#再点击下拉框下的选项 
m.find_element_by_xpath("//option[@value='10.69']").click() 
time.sleep(3) 
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

alert、confirm、prompt 的处理

text 返回alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错

1.接收alert

# -*- coding: utf-8 -*-  
from selenium import webdriver  
from time import sleep  
import os  
dr = webdriver.Chrome()  
file_path = 'file:///' + os.path.abspath('alert.html')  
dr.get(file_path)  
# 点击链接弹出alert  
dr.find_element_by_id('tooltip').click() 
sleep(2) 
alert = dr.switch_to_alert()  
alert.accept() 
sleep(2) 
#打印弹框信息
alert = dr.switch_to_alert() 
print alert.text 
#取消对话框(如果有的话) 
alert = dr.switch_to_alert() 
alert.dismiss() 
#输入值 
alert = dr.switch_to_alert() 
alert.send_keys("hello word") 
dr.quit() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

DIV对话框的处理

# -*- coding: utf-8 -*- 
from selenium 
import webdriver 
from time 
import sleep 
import os 
import selenium.webdriver.support.ui as ui 
dr = webdriver.Chrome() 
file_path = 'file:///' + os.path.abspath('modal.html') 
dr.get(file_path) 
# 打开对话框 
dr.find_element_by_id('show_modal').click() sleep(3) 
# 点击对话框中的链接 
link = dr.find_element_by_id('myModal').find_element_by_id('click') link.click() #dr.execute_script('$(arguments[0]).click()', link) sleep(4) 
# 关闭对话框 
buttons =dr.find_element_by_class_name('modal-footer').find_elements_by_tag_name('button') buttons[0].click() sleep(2) 
dr.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上传文件操作

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文 件。

 #coding=utf-8 
 from selenium 
 import webdriver 
 import os,time 
 driver = webdriver.Chrome() 
 #脚本要与upload_file.html 同一目录 
 file_path = 'file:///' + os.path.abspath('upload.html') 
 driver.get(file_path) 
 #定位上传按钮,添加本地文件 
 driver.find_element_by_name("file").send_keys('D:\\PycharmProjects\\test\\upload.txt') 
 time.sleep(2) 
 driver.quit() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/941669
推荐阅读
相关标签
  

闽ICP备14008679号