ui自动化---WebDriverApi接口

一、webdriver client原理

当测试脚本启动Chrome的时候,selenium-webdriver 会首先在新线程中启动Chrome浏览器。启动后selenium-webdriver会将Chrome绑定到特定的端口,绑定完成后该chrome实例便作为webdriver的remote server存在;客户端(也就是测试脚本)创建1个会话,在该session中通过http请求向remote server发送请求,remote server解析请求,完成相应操作并返回response;客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;

webdriver是按照server – client的经典设计模式设计的。

server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client(脚本)发送请求并做出相应;

client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;

二、启动浏览器

首次按参照以前的博客,将浏览器下载对应的驱动,并将驱动添加到系统环境变量后。再pycharm种输入以下代码即可启动浏览器

from selenium import webdriver
#实例化浏览器,启动浏览器
driver=webdriver.Chrome()
# driver=webdriver.Firefox()# drier=webdriver.Ie()
#以http协议发送请求 driver.get(‘http://www.baidu.com/‘)

三、元素定位

获取标签元素定位方式共18种

from selenium import webdriver
driver=webdriver.Chrome()
driver.get(‘http://ui.imdsx.cn/uitester/‘)
# 1、通过ID定位目标元素
d=driver.find_element_by_id(‘i1‘)
# d.send_keys(‘id定位到元素‘)

# 2、通过className定位目标元素
d1=driver.find_element_by_class_name(‘classname‘)
d1.send_keys(‘classname定位到元素‘)
#
# 3、 通过name属性定位目标元素
driver.find_element_by_name(‘name‘)
#
# 4、通过Xpath定位目标元素
driver.find_element_by_xpath(‘//*[@id="i1"]‘)
#
#5、通过css Selector定位目标元素
driver.find_element_by_css_selector(‘#i1‘)
#
# 6、 通过标签名称定位(注:在一个页面中,标签一定会重复,所以不用这个来进行定位)
driver.find_element_by_tag_name(‘input‘)
#
# 7、 通过标签中的文本查找元素
driver.find_element_by_link_text(‘登录‘)
#
# 8、 通过标签中文本的模糊匹配查找
driver.find_elements_by_partial_link_text(‘录‘)

还有8种是上面的复数形式,返回的是个list,比如:

这样的情况,可以通过下标来获取到返回的list种某一个元素,再进行操作

d[0].sendkeys(‘通过复数形式返回一个list‘)

还有2种是前面16种的底层封装,可通过查看底层源码找到。如下:

三、执行脚本

元素定位i的时候,有时候不能直接定位,需要借助js脚本。比如再打开网页后,由于网页很长,加入了滚动条。有些内容不能直观地显示在页面上,需要拖拽滚动条才可看到。这时候就可以加入操作滚动条的脚本,先让页面滚动到元素能够显示的位置,再进行定位

执行脚本用函数execute_script()

import time
time.sleep(1)
driver.execute_script(‘window.scrollTo(0,0);‘)#让浏览器滚动条转跳转最上面
time.sleep(1)#浏览器滚动到最上面后等1s
e=driver.find_element_by_partial_link_text(‘跳转‘)
e.click()

四、浏览器操作

driver.maximize_window()#最大化浏览器
driver.back()#浏览器后退键
driver.forward()#前进
driver.refresh()#刷新
# 获取当前浏览器的大小
driver.get_window_size()

# 通过像素设置浏览器的大小
driver.set_window_size(‘width‘,‘height‘)

# 获取当前窗口针对于Windows的位置的坐标x,y
driver.get_window_position()

# 设置当前窗口针对Windows的位置,x,y
driver.set_window_position(20,20)

# 最大化当前窗口,不需要传参
driver.maximize_window()

# 返回当前操作的浏览器句柄
driver.current_window_handle

# 返回所有打开server的浏览器句柄
driver.window_handles
#截图
driver.get_screenshot_as_file(‘pngdemo.png‘)

#退出驱动,关闭所有页面
driver.quit()
#关闭当前页面.指针不会自动切回到上一个页面。必须手动切回来
driver.close()

五、切换窗口

当点击页面上一个链接后,跳转到一个新的页面。此时如果想要操作新页面的元素,则需要将指针指向新页面

from selenium import webdriver
driver=webdriver.Chrome()
driver.get(‘http://ui.imdsx.cn/uitester/‘)
#先将滚动条滑至最顶端,让元素能够直接看到
driver.execute_script(‘window.scrollTo(0,0);‘)
import time
time.sleep(2)#停留2s
el=driver.find_element_by_css_selector(‘[href="/new-index/"]‘)#定位到元素后并点击跳转到新的页面
time.sleep(1)
el.click()
handles=driver.window_handles
print(handles)#打印出当前所有窗口句柄,默认指针在首次打开的第一个页面
# 窗口句柄打印结果:[‘CDwindow-AD4AD4A2DBED39512B11E0F393261452‘, ‘CDwindow-BB87742C82C3DDD61F153B89A568E45E‘]

#要想操作新窗口的元素,就要先将指针切换到第二个窗口
driver.switch_to.window(handles[1])#切换指针到新窗口
driver.find_element_by_css_selector(‘#newtag‘).send_keys(‘切换窗口后写入‘)#定位新窗口的标签,并操作
time.sleep(2)
driver.close()#关闭当前页面,也就是第二个页面。但是指针仍旧停留在第二个页面,不会自动回到第一个页。需要手动切回
driver.switch_to.window(handles[0])
driver.find_element_by_css_selector(‘#i1‘).send_keys(‘又切回来了‘)
# driver.quit()#关闭驱动,关闭浏览器

六、iframe

同一个网页种,如果有多个iframe的时候,如果想要定位到iframe中的元素,也是不能直接定位的,需要在不同的iframe之间切换

#iframe
#可以先通过定位找到iframe元素,然后再切换该元素对象
eleobj=driver.find_element_by_css_selector(‘[src="/new-index/"]‘)#先定位到这个元素,然后下面直接用这个元素对象
driver.switch_to.frame(eleobj)#切换到top-frame

#如果iframe有name属性或id属性,可以直接填写
# 第二种方式,直接用id或name
driver.switch_to.frame(‘top-frame‘)

注意的是,以上切换只能切换至下一级,如果想要跳出返回上一级frame,就要用driver.switch_to.parent_frame()

如果要返回最外层默认页面,则用driver.switch_to.default_content()

七、alert和confirm

alert、confirm同iframe类似,再操作的时候,都需要切换

driver.find_element_by_css_selector(‘#alert‘).click()
print(driver.switch_to.alert.text)#alert弹框的文本内容
driver.switch_to.alert.accept()#点击确认按钮
driver.switch_to.alert.dismiss()#取消

八、隐藏元素定位

对于有些元素,默认是隐藏不显示的,即display:none,这样的元素定位是无法定位到的。必须先让它显示,即将他的display属性做修改

driver.execute_script("document.getElementById(‘dis1‘).style.display=‘‘;")

然后就可以定位并操作le

原文地址:https://www.cnblogs.com/bendouyao/p/9302296.html

时间: 2024-10-30 09:08:55

ui自动化---WebDriverApi接口的相关文章

接口自动化与UI自动化两者的可行性

1.首先接口测试是跳过前端界面对服务端的测试,UI测试是对前端界面的测试,从分层测试的角度考虑,两者不应该是可以互相取代的关系. 2.从公司开展自动化的的角度考虑,可以重点关注这个项目开展接口自动化和UI自动化的分别需要的时间消耗.自动化测试人员成本.项目开展自动化测试的可行性.接口自动化和UI自动化的投入产出比,最终来确定开展接口自动化和UI自动化的比重. 3.从自动化测试覆盖率和难易程度来考虑,一般来说,系统中可测试的接口数量要比前端界面的功能点要少,并且接口的改动频率比前端界面改动频率低,

【Android测试】UI自动化代码优化之路(临时发布)

关于UI自动化的抱怨 听过不少人这样讲 "UI自动化非常不稳定,需求一改,界面一遍,全部都费了".我相信做过的人可能也会有同感.既然这个问题一直都是存在的,那么为什么没有人仔细分析原因呢? 我的老板georgeliao举了这样一个例子:每当需求变化的时候,开发没有跳起来,反而是测试跳了起来.然后不断的抱怨,界面元素全都改了,我的自动化的用例全部都要废弃掉了.那么我们是否想过,为什么开发可以从容不破的应对产品不断变化的需求?而我们却不能呢? 业内不少人也都放弃了UI自动化,觉得接口测试才

UI自动化,你值得拥有

去年春节联欢晚会,为了那张“敬业福”,全家都卯足了劲儿“咻一咻”,连节目都顾不上看了.当时我就想,要是能自动化该多好,不停点击屏幕,屏幕不疼手还疼呢,何况还不好分心,生怕错过了“敬业福”.玩“咻一咻”,是靠不停点击按钮来检查是否得到“敬业福”,而工作中的UI自动化,大抵也和“咻一咻”差不多,都是通过不断地输入,验证系统的输出是否正确.然而做UI自动化,效果并不好,收益低就算了,执行速度还慢.比如打开一个浏览器,可能就要等3-5秒,如果等浏览器访问网址,返回网页内容,就需要更长的时间.要是遇到问题

UI自动化测试之Jenkins配置

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试,但由于各种原因,接口自动化测试那部分功能整个废弃掉了,其中和易用性有很大关系,另外,也和我们公司的接口业务也有关.不过性能测试功能开发同学用的很欢快,还有接口的管理,目前是连接前端与后端的重要桥梁.目前又加入了环境管理(我公司主要用docker创建开发和测试环境),最近又加入了需求管

pytest+python下的UI自动化基础框架

整体设计模式: config目录:存放一些公共的静态文件,如项目名称,配置文件等这些环境变量(可以用其他组件替换,如sql,主要能把配置文件的内容被程序识别). httptrquest目录:存放接口代码,UI自动化因为其稳定性问题会出现有些地方出错导致后续无法进行,故添加接口操作. initailize目录:初始化代码,用于存放初始化操作的代码,比如初始化一些全局变量,初始化webdriver等,应用于整个项目的代码. test目录:真正执行的目录,用于存放测试用例的代码,会被pytest识别将

The Thinking of AutomaticTest(有关UI自动化的思考)

考虑因素: 容易维护 简洁易懂 代码重用性好 系统的稳定性强 UI自动化: 数据的获取:装载的数据文件类型.数据的形式.数据的解析方法定义. 1.利用Junit单元测试组织用例,明确输入数据.预期结果 2.建一张输入数据参数表,不断循环调用 页面的元素:页面元素的分页.元素的获取方式 .元素的存取方式 1.当页面元素较少时,直接获取元素 2.当页面元素较多时,从配置文件中获取元素 定位页面元素的方法:定义一个统一的方法,比如对点击事件的封装: public static void unifyCl

selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能

最近在UI自动化时遇到了,上一步成功操作后没有响应的情况(动画加载和浏览器加载导致实际没有问题),导致下一步无法成功操作,所有想在尝试2次操作后再次进行上一步操作解决这种情况导致的错误(其实是不想每一次有问题都要手动加线程沉睡) 1.java应用程序,暂停/开始按钮 import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionL

Robot FrameWork UI自动化脚本稳定性与原生关键字

在执行robotframework  的用例时,经常会出现稳定性差的问题.用例执行第一次成功,执行第二次就可能报错.自己对这个问题挠头很久,不知道怎么解决.今天在浏览网页的时候发现了一个不错的帖子,好像能够解决这个稳定性的问题.然后就把贴子搬了过来,为自己做一下备份(看了人家的帖子后,发现原来还是自己对robotframework的关键字用的不够熟悉造成的?(????ω????)?). 众所周知,在UI自动化在运行时,时常会收到来自各方的挑战:开发会说,你的自动化不稳定,又误报了:测试会说,这个

pywinauto处理UI自动化

之前一个项目的特殊性, 以及一些操作权限上的问题,不能使用现有工具进行UI自动化. 在一些资深tester建议下决定采用Python的pywinauto模块来处理Windows控件的UI操作. 1. 首先搭建pywinauto环境. 1). 可以参考vncdotool - A command line VNC client 安装python2.7.5, Twisted 和PIL. 2). 安装elementtree(elementtree-1.2.7-20070827-preview.win32