selenium中,有哪些不同定位元素方法?
•常用的八大定位方式:id、name、class、xpath、CSS selector、link_text、partial_link、tag •高级定位方式:JavaScript、jQuery
你最常用哪种定位方式,为什么?
•优先使用id
方式,因为简单方便,定位最快。 •其次是 Xpath
,因为xpath定位方式非常灵活,由于很多情况下html标签的属性不够规范,无法唯一定位,CSS不支持文本搜索,XPATH支持文本搜索 •最后选择 CSS
,因为在大多数浏览器中,解析速度比XPath更快,但是当查找元素比较简单,用css没错,如果复杂,用xpath比较好
怎么判断元素是否存在?
•方法1,用try...except...
def is_element_exist(driver, locator):
'''
判断元素是否存在,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "id")
:return: bool值,True or False
'''
try:
driver.find_element(*locator)
return True
except Exception as msg:
print("元素%s找不到:%s" % (locator, msg))
return False
•方法2,使用WebDriverWait
和expected_conditions
结合判断(推荐使用)
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def is_element_exist(driver, locator):
'''
结合WebDriverWait和expected_conditions判断元素是否存在,
每间隔0.5秒判断一次,30s超时,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "id")
:return: bool值,True or False
'''
try:
WebDriverWait(driver, 30, 0.5).until(EC.presence_of_element_located(locator))
return True
except:
return False
•方法3,用elements定义一组元素方法
def is_element_exist(driver, locator):
'''
判断元素是否存在,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "id")
:return: bool值,True or False
'''
eles = driver.find_elements(*locator)
if len(eles) < 1:
return False
else:
return True
如何通过子元素定位父元素?
•通过xpath的语法直接定位:.//*[@name="name"]/.. 两个点..就是代表父级元素
如何去定位动态变化的元素?
•类型一:属性动态
•通过xpath的轴, parent/following-sibling/precent-sibling •findbyelements遍历
•类型二:动态加载的元素
•触发动态事件事件,进而findElemnt,例如多级菜单,可能通过ajax加载数据
selenium中隐藏元素如何定位?
如果元素被隐藏,主要对元素添加了 type="hidden"
或者 style="display: none;"
属性
•定位隐藏元素跟正常元素一样,使用基本定位方式即可,但是无法进行click
、send_keys
、clear
等操作 •操作隐藏元素,通过JS操作隐藏元素(重点)
一个元素明明定位到了,点击无效(也没报错),如何解决?
•使用js点击,selenium有时候点击元素是会失效
定位不到元素是什么原因导致的?
•元素定位方式编写错误 •点击速度过快,页面没有加载出来就需要点击页面上的元素 •frame/iframe表单嵌套 •页面跳转到新的标签页,未切换handle窗口 •使用了动态属性进行定位元素 •页面上的警告弹框 •页面元素失去焦点导致脚本运行不稳定 •元素被遮挡,不可用,不可见
selenium 有哪些等待时间方式及场景应用?
总共有三种等待方式,分别为强制等待、隐式等待、显示等待
强制等待sleep()
不管元素,是否在页面出现都等 3 秒,再去操作它,是强制性。但是这种情况往往一般都只用在脚本的调试,真正的自动化测试用例中一般不会使用。
隐式等待implicitly_wait()
是设置的全局等待,等待时间是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。缺点:隐式等待的三秒钟就是在等待这个页面的所有 js 和图片加载出来,就算需要操作的按钮出来了,还要去等 页面js、img 加载完成
显示等待WebDriverWait()
是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
selenium 自动化测试中遇见过哪些异常?
方法 | 说明 |
NoSuchElementException | 当选择器没有返回一个元素时,异常抛出 |
ElementNotVisibleException | 元素DOM存在,但它是不可见的,不能与之进行交互,异常将抛出 |
NoSuchAttributeException | 当选择元素不存在该属性时,抛出异常 |
ElementNotSelectableException | 当选择不可选元素时,抛出异常 |
NoSuchFrameException | 当切换的框架不存在时,异常抛出 |
TimeoutException | 当执行操作命令执行超过最长时间完成,抛出异常 |
NoSuchWindowException | 当切换的目标窗口不存在时,异常抛出 |
如何选中下拉列表中的下拉选项?
•通过选项的顺序,第一个为0 select_by_index(index) • 通过value属性 select_by_value(value) • 通过选项可见文本 select_by_visible_text(text)
在日历这种web 表单你是如何处理的?
•直接通过js操作
Selenium如何处理弹窗?
•alert 弹框
•确认 driver.switch_to.alert.accept() •取消 driver.switch_to.alert.dismiss() •在弹出框输入内容 driver.switch_to.alert.send_keys("输入数据")
•window 弹框
•win32gui•Autolt
driver.quit()和driver.close()的区别?
•driver.close()仅关闭当前用户正在操作的页面 •driver.quit()关闭整个浏览器,关闭所有的页面
Selenium中如何保证操作元素的成功率或者稳定性?
•减少操作步骤,例如需要多次操作进入测试页面,直接通过网址来打开,减少不必要的操作 •合理的使用等待操作:time.sleep()、driver.implicitly_wait()、WebDriverWait() •使用多种方式进行id/name/class/xpath/css selector不同方式进行定位 •为了减少用例之间相互影响,所以设计用例时,尽量降低用例的耦合度 •多用try捕捉处理异常 •针对一些不稳定的动态控件经过JS实现操作 • 框架中使用用例失败重试,提升测试用例成功率
如何提高selenium脚本的执行速度?
•减少操作步骤,例如需要多次操作进入测试页面,直接通过网址来打开,减少不必要的操作 •中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载 •服务器允许的情况下,尽量设置多线程运行,提高执行速度,前提用例之间没有耦合度 •使用更高配置的电脑和选择更快的网络环境 •不要加太多的sleep,尽量使用显式等待
说明 Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间,运行脚本的线程(进程)数等。我们在自动化测试时不要只追求运行速度,需要在合理的情况下加快执行速度,最重要是要确保稳定性,保证自动化正常执行非常重要。
自动化测试使用过分布式吗?如何实现的?
•实际回答 •如果使用
•利用jenkins分布式Master-slave •利用selenium grid分布式处理
webdriver client 工作原理?
•selenium client(python等语言编写的自动化测试脚本)初始化一个service服务,端口为9515,通过Webdriver启动浏览器驱动程序chromedriver.exe •通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id •打开浏览器,绑定特定的端口,把启动后的浏览器作为webdriver的remote server •打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过RemoteConnection链接到remote server,然后使用execute方法调用_request方法通过urlib3向remote server发送请求 •浏览器通过请求的内容执行对应动作 •浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本
什么是POM,为什么要使用?
PO模式是page object model的缩写,顾名思义, 是一种设计模式,实现脚本的Page类和真实的网站页面一一对应起来。
POM优点:
•把web ui对象仓库从测试脚本分离,业务代码和测试脚本分离。 •每一个页面对应一个页面类,页面的元素写到这个页面类中。 •页面类主要包括该页面的元素定位,和这些元素相关的业务操作代码封装的方法。 •代码复用,从而减少测试脚本代码量。 •层次清晰,同时支持多个编写自动化脚本开发
在你做自动化过程中,遇到了什么问题吗?
•UI自动化中产品后期频繁地变更UI,经常要修改Page代码 •由于执行环境原因,导致用例执行不稳定 •为了降低代码耦合性,自动化代码写的多了很多 •新框架产生的页面元素定位问题 •前期多个人协同时,代码合并出现冲突 •自动化在CI时,执行出现一些报错,由于多人代码整体执行逻辑出现冲突问题 •由于服务端实现逻辑发生改变,导致初始化数据出现问题,以至于UI自动化测试时数据出现问题
你的自动化用例的执行策略是什么?
分情况来说
• 一、线上监控自动化脚本,使用Jenkins定时执行,可能设置为 10分钟执行一次,这种每次执行用例数不会太多,一般都是核心流程、核心接口 •二、冒烟测试用例,这种一般用于研发提测之后进行冒烟的用例,这种一般使用Jenkins的pipeline模式,在研发部署环境之后,执行自动化用例 •三、回归测试用例,这种一般在上线之后进行执行,这种一般手动触发执行,也是在Jenkins新建一个任务,手动build •不经常执行的测试用例,例如全量测试用例,这种一般在大版本发布、架构调整、语言翻写时,这种一般手动触发执行
自动化测试的优势是什么?
•减少回归测试成本 •减少兼容性测试成本 •提高测试效率 •提高测试覆盖率 •释放人力资源,让测试人员去做更加有收益的工作
说一下开展自动化工作的主要流程是怎样的?
•需求分析 •可行性分析 •定义自动化测试覆盖的范围 •制定测试计划 •自动化设计 •自动化框架选型与设计 •用例开发 •测试执行 •测试脚本维护
在制定自动化测试计划的需要考虑哪些方面?
•测试工具选型可行性分析 •确定要做自动化测试的范围和不做自动化测试的范围 •测试环境的准备与搭建 •制定测试各阶段时间表,例如工具选型、框架设计、用例编写等关键时间节点 •制定脚本执行的一些策略,如冒烟测试的频率,回归测试的时间点及频率等 •定义自动化测试的输出,比如脚本,测试数据,发现的缺陷,测试报告等
你自动化测试时关注的一些指标?
•自动化测试用例的覆盖率=自动化测试用例数 / 所用用例总数,这个比例越高测试速度越快,成本节约越多 •节省的时间成本=手工测试所花的时间-自动化测试所花的时间 •自动化测试的投入=开发脚本的投入+脚本维护的投入+工具价格 •自动化测试发现的缺陷数,每次回归测试时自动化测试发现的缺陷数及漏测数,反应了自动化用例的有效性 •动化测试投入产出比 ROI=(手工测试的成本-自动化测试成本)/ 自动化测试成本 ROI如果是负值说明自动化测试的成本未收回,ROI为正值说明自动化测试成本已回收,且值越大说明回报越好
你们公司自动化测试用例大概多少条?覆盖率多高?
•实际情况回答即可 •覆盖率算法,自动化测试用例的覆盖率=自动化测试用例数 / 所用用例总数
你们公司开展自动化测试遇到一些什么问题?
•公司领导对于自动化期望值太高,短时间需要见效且效果明显 •部门人员技术能力参差不齐,实际达到能力要求的不多 •希望自动测试发现大量的新缺陷 •项目流程不规范,项目变动频繁导致自动化用例维护成本高
以上内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
最后基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等配套学习资源在下方公众号免费获取~