• 0
  • 0
分享
  • 同学,你为什么定位不到元素?——软件测试圈
  • 曼倩诙谐 2022-08-24 10:55:51 字数 3211 阅读 4209 收藏 0

  在UI自动化中,一般先要找到需要操作的元素对象,然后进行操作。

  定位元素成功与否,决定了你的用例的成败。所以定位元素很重要。

  很多同学在用Selenium,Appium等做自动化的时候,有的时候却总能碰到这个熟悉的错误:

  NoSuchElementException)

  排查了很久,也找不到原因。一下子就懵了,刚才还好好的,这是怎么了?

  UI 自动化,先天不足的就是不够稳定。很多因素导致定位不到元素。

  可能网速导致还还没加载完全,你却已经操作了。

  可能页面渲染慢,资源还没加载完全,特别是弱网情况下明显。

  可能有广告等弹出框。

  可能你等待时间不够,目标还没出现,你却先下手了。

  种种因素,让你获取不到元素,从而报错。

  下面我们来分析一下,找不到元素的原因有哪些,并找到解决方案。

  1.Frame/Iframe原因定位不到元素:

  这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。

  解决方案:

  如果iframe有name或id的话,直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)。如下:

  driver=webdriver.Firefox()
  driver.get(r'http://www.126.com/')
  driver.switch_to_frame('x-URS-iframe')  #需先跳转到iframe框架
  username=driver.find_element_by_name('email')
  username.clear()
  #driver.switch_to.frame() python3
  #driver.switch_to_frame() python2

  操作完frame里面的元素后,要跳出来,接着操作其它的元素。

  driver.switch_to.default_content()

  2.Xpath描述错误原因:

  由于Xpath层级太复杂,容易犯错。但是该定位方式能够有效定位绝大部分的元素,建议掌握。

  我们定位元素的原则是:越简单越好。如果有id,name,class,css,link等,这是最简单不过了的。如果实在不好定位,我们可以用xpath,xpath建议不要用绝对路径,也不宜过长,一般用模糊匹配就可以了。

  如:find_element_by_xpath(“//标签名[@属性=’属性值’]”)

  find_element_by_xpath("//*[@id='snake')]")

  这个属性可以是id,name,class等任意一种

  也可以通过内容来匹配:

  如:

  find_element_by_xpath("//*[contains(text(),'安蜀黍')]")

  也可以通过组合匹配:

  如:

  find_element_by_xpath("//*[contains(text(),'安蜀黍') and @id=‘snake']")

  建议定位完了以后,用我教的那种办法,在浏览器控制台检验一下。

  3.页面还没有加载出来,就对页面上的元素进行的操作:

  这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样。

  设置一下显式等待时间。

  import time
  time.sleep(3)

  设置等待时间可以解决这个问题,缺点是需要设置较长的等待时间,案例多了测试就很慢,而且你不太清楚要等待多久,等待时间长了,浪费时间,等待时间短了,没有作用。

  推荐大家用智能等待,在某个时间范围内,如果出现,就直接执行,如果没有出现,就抛出timeout异常,如下所示:

  from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.ui import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  driver = webdriver.Chrome()
  driver.get("https://www.csdn.net/")
  try:
      element= WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'iv.J_close.layer_close')))
  finally:
      driver.quit()

  4. 不可见元素定位

  有些元素,是需要hover在另外一个元素上,才显示。是invisiable,disable的,如下拉列表等。所以我们先要将鼠标移到其父节点上,显示以后才对其定位。移动鼠标可以这样写:

  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  driver = webdriver.Chrome()
  ActionChains(driver).move_to_element(driver.find_element_by_id('父节点')).perform()
  element = driver.find_element_by_id("子节点")

  5. 广告页面

  见到广告页,不要怕,有些是弹框的,有些是浮动的页面。基本都是能定位得到的。

  比如这种:

  driver.get("https://www.csdn.net/")
  time.sleep(5)
  driver.find_element_by_css_selector('div.J_close.layer_close').click()

  又如这种:

1.jpg

  driver.get("https://www.1688.com/")
  time.sleep(5)
  driver.find_element_by_css_selector('i.identity-icon.identity-close-icon').click()

  都能定位得到,直接操作一下就可以了,也可以写个公共的方法,来处理这些广告或者弹框。

  6. 弹出框

  有的时候,会有弹出框来让你confirm,你必须去点击一下,否则页面失去焦点,导致你无法操作

  Alert 弹出框:

  driver.switch_to.alert.accept()    #ok

  driver.switch_to.alert.dismiss() #cancel

  7. 窗体

  有的时候,我们操作的时候,会打开另外的窗体,或者浏览器的其它tab页。

  句柄已经切过去了,但是焦点还没切过去,所以需要switch_to.window(),把焦点页切过去,才能对当前页进行操作。

  思路是: 获取所有句柄,返回一个list,而要切的对象都是最后一个,所有可以用[-1]直接切过去。

  如:

  driver.switch_to.window(driver.window_handles[-1])

  在实践中,可能会遇到各种问题,只有通过不断积累,才能应付自如。



作者:Snake    

来源:http://www.51testing.com/html/47/n-4479347.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   小鹏汽车 CEO 何小鹏18日分享了智驾团队在德国拍摄的高速 NGP 测试视频,并称当前“进展不错”。  何小鹏表示,位于德国的团队反馈,小鹏 XNGP“感知泛化能力极强”,拿到欧洲之后几乎可以直接上路,而且受过国内交通路况“博弈训练”的智驾软件,在海外的体验格外流畅。“从技术层面上来看,高阶智驾全球都能用指日可待。”  本月早些时候,近千台小鹏 G9 发运德国,为小鹏汽车有史以来单次最大规模的海外发运。据悉,此次出口总值超过 5 亿元,创中国高端智驾纯电汽车单船出口价值第一。上月末,小鹏汽车宣布正式进入德国市场,并将于今年 5 月开始在德国销售小鹏 G9 和小鹏 P7 的国际版车型。  ...
            0 0 716
            分享
          •   经典软件测试课程免费送,点击下方链接填写测试行业调查问卷,即刻领取,还有机会获得精美测试大礼包~链接:http://vote.51testing.com/   自动化战略  在查看工具的许多选项和构建概念证明之前,第一步是问“为什么”这个问题。  可以说,启动UI自动化项目的最常见原因是“回归测试花费的时间太长”。每个版本,他们有一周的时间开发新功能,然后将新代码交给测试人员,然后有一周的时间对新工作进行测试和错误修复。当一切都完成后,仍然需要有人做一些调查,希望能发现最近所有的代码变动是否引入了任何令人惊讶的问题。最后一部分,回归测试,要么花费太长时间,要么时间紧迫。这就是有人想到所有实...
            0 0 1385
            分享
          • 把做Android开发以来碰到的一些不错的性能分析工具做个整理汇总...Debug GPU Overdraw类型:系统自带功能UI渲染检测功能(打开Settings,然后到 Developer Options -> Debug GPU Overdraw 选择 Show overdraw areas,手机系统设置中文的孩纸,自行对照翻译进去哈)作用:用来检测UI的重绘次数,开发者可以用来优化UI的性能。使用心得:检测UI性能的利器,对于开发者做UI优化的帮助挺大的。因为大量的重绘容易让app造成卡顿或者直接导致丢帧的现象。开发者熟悉View的绘制原理可以结合对一些布局或者自定义控件做相应的...
            13 13 992
            分享
          •   chatGPT回答未来五年我们测试发展的方向  问题:未来五年测试行业发展怎么样  回答如下:  预测未来五年测试行业的发展趋势是有困难的,但是一般认为,测试行业将继续发展,因为软件行业的需求不断增长。  以下是一些预测的发展趋势:  智能化测试:随着人工智能和机器学习技术的不断发展,智能化测试将成为测试行业的主要趋势。  自动化测试:自动化测试已经成为测试行业的重要组成部分,并将在未来五年继续发展。  DevOps: DevOps的普及将使得测试和开发更加紧密地结合在一起,测试将成为软件开发的一个不可分割的组成部分。  云测试: 随着云计算技术的不断发展,试也将越来越多地利用云技术。  ...
            0 0 175
            分享
          • 前言下面将详细说说微信小程序如何发布体验版(测试环境)和线上版(生产环境)小程序如何打包1、打开微信开发者工具,并使用微信扫码登录2、打开已经编写好的小程序代码项目3、当代码编写完成后,点击上传4、上传完成后,登录微信公众平台,点击版本管理,刚刚打包上传的版本就是最新的体验版5、如果需要将体验版转为线上版本,那么就点击体验版的提交审核按钮,补充审核资料即可6、体验版审核成功后,会出现在审核版本上,点击审核版本的发布生产,即可将此版本转为线上版本,此时在微信就可以搜出最新的生产环境的小程序了作者:Boale_H原文链接:https://blog.csdn.net/Boale_H/article/...
            0 0 5655
            分享
      • 51testing软件测试圈微信