• 0
  • 0
分享
  • 同学,你为什么定位不到元素?——软件测试圈
  • 曼倩诙谐 2022-08-24 10:55:51 字数 3211 阅读 4195 收藏 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傅盛与金沙江创投董事总经理朱啸虎“互怼”后,朱啸虎又发了朋友圈解释了一番。  他表示,昨天的对话造成很多误解,其实我们应该是国内垂直AIGC真正出手最多的早期投资人(这句话在对话中被故意删掉了)。  其核心观点为不要迷信通用大模型,“明年3.5就成commodity,3年后4也将是commodity!对于大部分创业者,场景优先,数据为王!”朱啸虎称。作者:佚名原文链接:新浪科技_新浪网(sina.com.cn)
            0 0 1315
            分享
          •   消息源 @i 冰宇宙近日在 X 平台上发布推文,在评论三星业界首款 10.7Gbps LPDDR5X DRAM 内容时表示,明年推出的 Galaxy S25 基础款手机依然 8GB 内存起步。  国内安卓手机内存早就“卷”到 12GB 起步,而且不断推高到 16GB、24GB 等,但三星的 Galaxy S 系列依然是 8GB 起步,因此给人的感觉是“不思进取”,也有不少网友调侃三星“被制裁”了。  如果真的如消息源所曝料的,明年三星 Galaxy S25 基础款继续 8GB 内存起步,那么即便采用更高规格,对于消费者的吸引力会大打折扣。  查询公开信息,该消息源今天还表示三星计划将 Go...
            0 0 679
            分享
          •   新浪科技讯 北京时间1月16日晚间消息,据报道,微软正考虑对旧金山人工智能(AI)研究公司OpenAI投资100亿美元。分析人士称,这笔潜在交易有可能成为人工智能新时代的决定性交易。  如果微软对人工智能技术深远影响的押注是正确的,那么这笔交易还可能引发人工智能世界的一场重组,因为其他科技公司也竞相在“生成式人工智能”(Generative AI)的新领域争夺自己的位置。  上个月,OpenAI因为推出了一款智能聊天机器人系统ChatGPT而成为了全球关注的焦点。ChatGPT是一套人工智能系统,可以回答问题,并用听起来十分自然的语言生成文本。  ChatGPT很快就得到了微软的关注。微软...
            0 0 1075
            分享
          • 在Python开发中,数据存储、读取是必不可少的环节,而且可以采用的存储方式也很多,常用的方法有json文件、csv文件、MySQL数据库、Redis数据库以及Mongdb数据库等。1. json文件存储数据json是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,可以轻松解决py2和py3的编码问题,内容结构类似于python中的字典和列表,层次结构简洁而清晰,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。2. csv文件Python可以将数据存储为CSV文件格式,我们可以用excel打开CSV文档,进行数据的浏览,十分方便,以下是将数据存...
            13 13 1590
            分享
          • 作为测试人员,发现问题提交问题是我们的第一要务,但是如果能够简单的定位问题,指出问题的原因是前端还是后端(方便指派给正确的处理人),甚至更直接的指出出错的地方,那就是大大加分了。今天分享一个简单但是常见的场景的问题分析:PC后台,数据导入和数据导出功能是两个常用功能,而导出就往往涉及全部导出,翻页后导出,勾选部分数据导出,搜索关键词查询后导出,组合条件搜索后导出等场景。在一次项目测试过程中,就遇到了一个问题,没有加任何筛选条件,直接点击导出按钮,但是导出的数据只有第一页,而不是全部数据。看了下接口的日志,发现了以下问题:1、接口导出返回的数据中,就只有第一页的数据2、进一步排查发现,前端给后端...
            1 1 9519
            分享
      • 51testing软件测试圈微信