定位一组对象

webdriver使用find_element方法定位一个特定的对象,

定位一组元素的方法叫:find_elements。

定位一组对象一般用于以下场景:

  • 批量操作对象,比如将页面上的checkbox都勾选上
  • 先获取一组对象,再在这组对象中过滤需要具体定位的一些对象。

举例:使用tag_name定位一组指定页面上的checkbox

filepath='file:///'+ os.path.abspath('checkbox.html')
driver.get(filepath)
inputs=driver.find_elements_by_tag_name("input")
for input in inputs:
if input.get_attribute('type')=='checkbox':
input.click()

层级定位

在实际的项目测试中,经常会遇到无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。

层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。

driver.find_element_by_id('***').find_element_by_link_text('***')

定位frame中的对象

再web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B。

switch_to_frame方法可以把当前定位的主题切换到frame里,在frame里实际是嵌套了另外一个页面,而webdriver每次只能在一个页面识别,所以switch_to_frame方法去获取frame中嵌套的页面。

driver.switch_to.frame('frame 1')  #移动到id为frame 1的frame上
print driver.find_element_by_css_selector("#div1").text driver.switch_to.default_content() #将识别的主体切换出frame
print driver.find_element_by_css_selector("#id1").text

备注:

switch_to.frame的参数必须是id或者是name,所以一个frame只要有id和name处理起来很容易。如果没有的话,两种解决思路:

1、让开发加上id或者name

2、使用xpath等方式定位然后实现跳转

alert/confirm/prompt处理

具体思路是使用switch_to.alert()方法定位到当前的alert/confirm/prompt(这里注意当前页面只能同时含有一个控件,如果多了会报错的,所以这就需要处理了),然后在调用Alert的方法进行操作。

Alert提供了以下几个方法:

text:返回alert/confirm/prompt中的内容

accept:点击确认按钮

dismiss:点击取消按钮

sendKeys:向Prompt中输入文字

下拉框处理

1、下拉框通过元素定位识别

driver.find_element(By.XPATH,'//option[@value="mango"]').click()
#以上元素为下拉框中的选项

2、创建一个select的对象,然后通过相应方法处理

selectElement=driver.find_element(By.XPATH,'//select[@id="Selector"]')
s=Select(selectElement)
s.select_by_index(2) #索引定位,索引从0开始
time.sleep(2)
s.select_by_value("mango") #value属性值
time.sleep(2)
s.select_by_visible_text("桔子") #可见文本内容

调用javascript

当webdriver遇到无法完成的操作时候,这个时候可以使用javascript来完成,webdriver提供了execute_script()接口来调用js代码。

执行js有两种场景:

一种是在页面上直接执行js

另一种是在某个已经定位的元素上执行js

driver.execute_script('alert("hello!!");')  #弹出窗口

driver.execute_script("arguments[0].style.border='5px solid red'",wl)  #加边框

js="var user_input=document.getElementById('su').getAttribute('id');return user_input;"
driver.execute_script(js) #识别并获取对象属性
driver.execute_script("document.body.scrollTop=10000;") #浏览器滚动条滚动 js='arguments[0].removeAttribute("value");' #移除元素的value属性
js='arguments[0].setAttribute("value","newdream");' #设置元素的value属性
driver.execute_script(js.wl)

多窗口处理

有时候我们在测试一个web应用的时候会出现多个浏览器窗口的情况,

webdriver提供了相应的解决方案,如下:

首先要获得每一个窗口的唯一表示符号(句柄),通过获得的句柄来区分不同的窗口,从而对不同窗口的元素进行操作。

举例:

current_handle=driver.current_window_handle  #获得当前窗口的句柄
driver.find_element(By.LINK_TEXT,"另一个页面").click()
time.sleep(3)
handle_list=driver.window_handles #获得所有窗口的句柄
for h in handle_list:
if h!=current_handle:
driver.switch_to.window(h) #通过句柄跳转窗口 # driver.close() #关闭新打开的窗口 #回到前面的页面
driver.switch_to.window(current_handle)

处理验证码

解决验证码的方法如下:

1、去掉验证码:在测试环境去掉,对于开发来说屏蔽相关验证码代码

2、设置万能码:只要用户输入这个万能码,程序就认为验证通过

3、验证码识别技术:可以通过python-tesseract来识别图片验证码,python-tesseract是光学字符识别Tesseract OCR引擎的Python封装类。不过不能达到100%识别

举例:

from RIL import Image
from pytesseract import pytesseract
img=Image.open(r'c:\index.png')
a=pytesseract.image_to_string(img)
print a

4、记录cookie:通过向浏览器添加cookie可以绕过登录的验证码,在用户登录之前,通过add_cookie()方法将用户名和密码写入cookie,使用该方法最大难点是如何获取用户名和密码的cookie信息,可以通过get_cookies()或者询问开发解决此问题。

处理cookie

假如我们需要验证浏览器中是否存在cookie,因为基于真实的cookie是无法通过白盒和集成测试完成的,webdriver可以读取、添加和删除cookie信息webdirver操作cookie的方法如下:

  • get_cookies() 获取所有cookie信息
  • get_cookie(name) 返回特定name有cookie信息
  • add_cookie(cookie_dict) 添加cookie,必须有name和value值
  • delete_cookie(name) 删除特定部分的cookie信息
  • delete_all_cookie() 删除所有cookie信息

举例:

#获取所有cookie并打印
driver.get("http://www.youdao.com")
for cookie in driver.get_cookies():
print "%s -> %s"%(cookie['name'],cookie['value'])
#添加cookie举例
driver.add_cookie({'name':'key-aaaaa','value':'value-bbbb'})
driver.delete_cookie("key-aaaaa") #删除cookie

cookie处理

利用cookie完成网站的免密码应用

代码思路:

第一阶段

打开网站的登录界面

获取登录之前的cookie

等待60s,这个时间手动去输入用户名、密码、验证码登录

获取登录之后的cookie

把登录之后的cookie与登录之前的cookie打印并进行对比

找出登录之后不同的cookie或增加的cookie信息

第二阶段:

新编写一个脚本

打开网站的登录页面

用add_cookie()方式去逐项增加登录之后不同的cookie

刷新网站,即可完成自动登录操作

#第一阶段代码实例(禅道举例):
driver.get("禅道地址")
cookies=driver.get_cookies()
for cookie in cookies:
print(cookie)
time.sleep(60) #暂停目的,做手工登录操作
print("登录之后的cookie")
cookies=driver.get_cookies()
for cookie in cookies:
print(cookie) #第二阶段代码实例(禅道举例):
driver.get("禅道地址")
driver.add_cookie({'name':'sid','value':'ge1o36obij20g1fktssm7oeki2','domain':'192.168.4.160','path':'/'})
time.sleep(2)
driver.refresh()

备注:add_cookie()里面放置字典参数,cookie字典一般需要包含name、value、domain、path等字段,如果遇到cookie有Expirse字段,要去掉

selenium处理常见自动化场景的更多相关文章

  1. 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第七篇博 ...

  2. Swift闭包概念与常见使用场景总结

    ·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...

  3. 基于Selenium的Web自动化框架增强篇

    在写完上一篇“基于Selenium的Web自动化框架”(http://www.cnblogs.com/AlwinXu/p/5836709.html)之后一直没有时间重新审视该框架,正好趁着给同事分享的 ...

  4. Git 基础 —— 常见使用场景

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 突然插入 Bugifx 工作, ...

  5. axios基于常见业务场景的二次封装

    axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络 ...

  6. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

  7. selenium的常见异常

    selenium的常见异常 Exceptions(异常)Python 自带的异常,所有异常的基类. 异常: selenium.common.exceptions.ElementNotSelectabl ...

  8. 浅析阿里云API网关的产品架构和常见应用场景

    自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...

  9. 【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 二.话不多说,直接开干,开始搭建自动化测试环境 这里以前在 ...

随机推荐

  1. TreeMap树映射取出对象的方式

    1.直接获取该TreeMap集合中的关系:entrySet() Map接口中的方法,返回值类型是该集合中的各个关系:返回值类型是:Set类型的Map.EntrySet类型:然后在通过Set集合中特有的 ...

  2. 堡垒机的核心武器:WebSSH录像实现

    WebSSH终端录像的实现终于来了 前边写了两篇文章『Asciinema:你的所有操作都将被录制』和『Asciinema文章勘误及Web端使用介绍』深入介绍了终端录制工具Asciinema,我们已经可 ...

  3. CentOs虚拟机配置

    1.打开“VMware”,点击“主页”,点“创建新的虚拟机”: 2.会弹出一个“新建虚拟机向导”,类型选择“典型”,点击“下一步”: 3.选择“稍后安装操作系统”,点击“下一步”: 4.我们用的是Li ...

  4. 023.掌握Pod-Pod扩容和缩容

    一 Pod的扩容和缩容 Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令或通过RESTful API对一个Deployment/RC进行 ...

  5. 防火墙和SELinux复习02

    1.防火墙 防火墙主要起隔离作用,严格的过滤入站,允许出站.又分为硬件防火墙和软件防火墙,硬件防火墙主要保护一群机器,而软件防火墙主要保护本机. 防火墙相关命令:systemctl status fi ...

  6. 用Swoole+React 实现的聊天室

    前后端分离的项目,使用 Swoole+React 实现的聊天室,整个项目的框架结构可以进行参考,前端 react+react-redux+react-router+react-ant 等等,后台使用 ...

  7. php设置随机ip访问

    当我们请求一个站点的时候,http报文头会携带一些ip信息,我们通过伪造这些信息,就可以形成不同ip访问请求的效果. header的头部CLIENT-IP和X-FORWARDED-FOR我们都设置为想 ...

  8. GitHub的高级搜索方式

    平时在学完一个知识后,需要写些 demo来进行练手,这个时候 GitHub就是最好不过的资源库了,以下整理了一些关于在 github 上面找项目的一些小技巧. 一.单条件使用 项目名称 仓库名称包含 ...

  9. C博客作业00—我的第一篇博客

    C博客作业00-我的第一篇博客 1. 你对网络专业或者计算机专业了解是怎样? 泛泛了解 - 原先只知道网络工程隶属于计算机工程学院,与院中其他专业一样,同样都需要学习大量的计算机基础知识,然后再分支学 ...

  10. 简单入门Kubernetes

    什么是Kubernetes 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ 个人理解 基于容器技术 分布式架构 弹性伸缩 隔离物理机 和 ...